JS Promise在上一个解决方案解决之前开始链中的下一个承诺

时间:2019-02-11 17:41:33

标签: javascript promise es6-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)
  })
}

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

3 个答案:

答案 0 :(得分:2)

尝试这样的事情:

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);
  }
})();

答案 1 :(得分:1)

您可以使用promise.all同时运行所有诺言(如果拒绝/解决诺言的顺序无关紧要)。当需要确保必须首先解决顺序时,也会出现promise chaining

答案 2 :(得分:0)

您可以将promiseVar设置为循环中then()产生的承诺。这将改变承诺:

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

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

这将创建所有的诺言,但是它将使最后一个诺言没有那么一个。您可以在循环外使用promiseVar.then()来了解最后一个承诺何时得到解决。