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循环中,我希望它仅在前一个承诺解决后才开始下一个承诺,但控制台会以随机顺序记录数字,就好像它在解决最后一个承诺之前启动每个承诺一样。是否有更好的方法来执行这样的一系列承诺,或者我忽略了某些事情。
答案 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()
来了解最后一个承诺何时得到解决。