[英]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.