javascript - 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。有没有更好的方法来执行这样的一系列承诺,或者我忽略了一些东西。
解决方案
尝试这样的事情:
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);
}
})();