[英]Chain execution of array of promises in javascript
我正在尝试创建一个承诺链,其中每个承诺在执行之前等待前一个承诺。
const syncStatusChanges = () => { return new Promise((resolve, reject) => { console.log("in") setTimeout(() => { console.log("done") resolve({ done: true }) }, 2000); }); } const run = () => { const promises = [syncStatusChanges(), syncStatusChanges()] promises[0].then(res => { console.log("done 1") promises[1].then(res => { console.log("done 2") }) }) } run()
在这个例子中,输出是:
in
in
done
done 1
done
done 2
但我希望它是:
in
done
done 1
in
done
done 2
我还希望它适用于任意数量的函数。 我看到了这个答案,但输出是一样的!
var promise = statusChangeCalls[0];
for (var i = 1; i < statusChangeCalls.length; i++)
promise = promise.then(statusChangeCalls[i]);
正如评论中所写。 您正在执行数组本身中的函数。 看到你的输出,我明白了什么。 下面的运行功能可以帮助你。
const run = () => {
const promise = syncStatusChanges();
promise.then(res => {
console.log("done 1")
syncStatusChanges().then(res => {
console.log("done 2")
})
})
}
Promise 急切地执行。 它不会等待注册 then 函数。 你可以寻找observable ,它们在执行上很懒惰。 基本上他们会等到你订阅他们。
关于循环的第二个疑问。 您可以使用async await关键字来实现链接。 只需在 runInLoop 函数中传递 number 作为参数即可多次执行 promise。
const runInLoop = async(numberOfPromisesCall)=> {
for (let i = 0; i < numberOfPromisesCall; i++){
await syncStatusChanges();
console.log(`done ${i + 1}`);
}
}
runInLoop(5)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.