首頁 > web前端 > js教程 > 主體

如何在 JavaScript ES6 For 迴圈中序列化 Promise?

Linda Hamilton
發布: 2024-11-27 19:44:19
原創
277 人瀏覽過

How to Serialize Promises in a JavaScript ES6 For Loop?

JavaScript ES6 Promise For 迴圈序列化

在給定的程式碼中,您嘗試在for 迴圈中順序執行Promise,但

在給定的程式碼中,您嘗試在for 迴圈中順序執行Promise,但遇遇到以下問題:循環同步執行,導致不可預測的輸出。

理解問題:

Promise 封裝了非同步操作,但循環的同步性質會同時觸發所有 Promise,而不管所需的順序。

Promisifying setTimeout:

為了方便順序執行,我們可以promisify setTimeout來獲得一個promise,當定時器到達時就會解析過期:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
登入後複製

解決方案選項:

有多種方法可以解決這個問題,利用Promise 和非同步程式設計技術。

1.具有初始Promise 的For 循環:

從立即解析的Promise 開始,您可以將後續的Promise 連結為之前的Promise:
for (let i = 0, p = Promise.resolve(); i < 10; i++) {
  p = p
    .then(() => delay(Math.random() * 1000))
    .then(() => console.log(i));
}
登入後複製

2.初始Promise 的Array.reduce:

使用Array.reduce,您可以建立類似for 迴圈方法的Promise 鏈:
[...Array(10)]
  .reduce(
    (p, _, i) =>
      p.then(() => delay(Math.random() * 1000))
        .then(() => console.log(i)),
    Promise.resolve()
  );
登入後複製

3.函數作為Promise 解析回呼:

您可以定義一個將自身傳遞為解析回呼的函數,從而允許遞歸Promise 鏈:
const loop = (i) => {
  delay(Math.random() * 1000)
    .then(() => console.log(i))
    .then(() => {
      if (i < 10) loop(i + 1);
    });
};
loop(0);
登入後複製

4. async/await 語法(ES2017):

ES2017 引入了async/await 處理語法來簡化
const main = async () => {
  for (let i = 0; i < 10; i++) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
};
main();
登入後複製

5. for wait...of 語法(ES2020):

ES2020 引入了一種特殊的語法來迭代異步可迭代對象:

(async () => {
  for await (const i of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
})();
登入後複製

透過利用這些技術,您可以順序執行Promise在循環內,確保所需的操作順序並避免不可預測的輸出。

以上是如何在 JavaScript ES6 For 迴圈中序列化 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板