首页 > 解决方案 > JS Promise 在前一个 Promise 解决之前开始链中的下一个 Promise

问题描述

function promise1 (num) {
  return new Promise(resolve1 => {
    let timeout = Math.random() * 5000
    setTimeout(() => {
      console.log(num)
      resolve1()
    }, timeout)
  })
}

let promiseVar = promise1(0)
for (let i = 1; i < 5; i++) {
  promiseVar.then(() => {
    promiseVar = promise1(i)
  })
}

我有一个函数可以创建一个可能需要任意时间才能完成的承诺,但我希望这些承诺以特定的顺序执行。在 for 循环中,我希望它仅在前一个 promise 解决后才开始下一个 promise,但控制台以随机顺序记录数字,就好像它在最后一个 promise 解决之前启动每个 promise。有没有更好的方法来执行这样的一系列承诺,或者我忽略了一些东西。

标签: javascriptpromisees6-promise

解决方案


尝试这样的事情:

function promise1 (num) {
  return new Promise(resolve1 => {
    let timeout = Math.random() * 5000
    setTimeout(() => {
      console.log(num)
      resolve1()
    }, timeout)
  })
}

function runNext(i, max) {
  if (i > max) return Promise.resolve(true);
  return promise1(i).then(() => runNext(i+1));
}

runNext(0,4);

或者让自己变得非常容易并使用 async/await

(async () => {
  for (let i = 0; i < 5; i++) {
    await promise1(i);
  }
})();

推荐阅读