Синхронизация потока управления после if-then-else с обещаниями - PullRequest
1 голос
/ 10 апреля 2020

У меня есть несколько сценариев ios, где в зависимости от условия мне необходимо выполнить асинхронную обработку, а затем продолжить работу независимо от выбранного пути. Этот код работает так, как я ожидаю:

  let processingComplete = new Promise(function (resolve, reject) { }); // create pending promise
  let condition = true; 

  var wait = function () {
    return new Promise((resolve, reject) => {
      setTimeout(resolve, 500);
    });
  }

  if (condition) {
    processingComplete = wait();
  } else {
    // do something else, synchronously  
    processingComplete = Promise.resolve();
  }

  processingComplete.then(() => {
    console.log("entering processingComplete.then...")
  });

Однако, если обещания вложены более чем в одну глубину, предложение .then никогда не срабатывает. Например,

  let processingComplete = new Promise(function (resolve, reject) { }); // create pending promise
  let condition = true; 

  var wait = function () {
    return new Promise((resolve, reject) => {
      setTimeout(resolve, 500);
    });
  }

  if (condition) {
    wait()
    .then(() => {
      processingComplete = wait() // nesting of promises
    })
  } else {
    // do something else, synchronously 
    processingComplete = Promise.resolve();
  }

  processingComplete.then(() => {
    // this code never fires with nested promises
    console.log("entering processingComplete.then...")
  });

Я, конечно, знаком с использованием обещаний, но я не понимаю, почему это не работает. Я бы приветствовал любые идеи.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Ваш второй просто назначает processingComplete слишком поздно в обработчике .then(), который вызывается позже ПОСЛЕ того, как вы пытаетесь его использовать. Вам нужно правильно изменить свои обещания:

processingComplete = wait().then(wait);

Или, если в реальном коде есть другая обработка:

processingComplete = wait().then(() => {
    // ... other code here
    return wait();
});
1 голос
/ 10 апреля 2020

Работа с большим количеством обещаний иногда лучше сделать с async / await. В вашем примере вы присваиваете processingComplete значение после , которое вы назвали processingComplete.then(...). Это может помочь:

let processingComplete = new Promise(function (resolve, reject) { });
let condition = true; 

var wait = function () {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, 500);
  });
}

async function run() {
  if (condition) {
    await wait()
    processingComplete = wait()
  } else {
    processingComplete = Promise.resolve();
  }

  processingComplete.then(() => {
    console.log("entering processingComplete.then...")
  });
}

run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...