簡體   English   中英

javascript中promise數組的鏈式執行

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM