首页 > 解决方案 > Synchronizing flow of control after if-then-else with promises

问题描述

I have multiple scenarios where, based on a condition, I need to do asynchronous processing and later proceed regardless of the path taken. This code works as I expect:

  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...")
  });

However, if the promises are nested more than one deep the .then clause never fires. For example,

  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...")
  });

I'm certainly familiar with using promises, but I'm not understanding why this does't work. I'd welcome any insights.

标签: javascriptpromise

解决方案


处理大量的 promise 有时会更好async / awaitprocessingComplete在您的示例中,您调用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()

推荐阅读