成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

掌握這八個 Promise 并發控制技巧,性能大幅提升

開發 前端
當我們需要同時處理多個異步任務時,如何有效地控制 Promise 的并發,就成為了一個影響性能和用戶體驗的關鍵問題。

Promise 已經成為 JavaScript 里處理異步操作的標準方式。然而,當我們需要同時處理多個異步任務時,如何有效地控制 Promise 的并發,就成為了一個影響性能和用戶體驗的關鍵問題。

假設,你需要同時請求 100 個接口來獲取數據。如果一股腦地發起所有請求,可能會導致以下問題:

  • 瀏覽器并發限制:瀏覽器對同一域名的并發請求數量有限制(通常是 6-8 個)。過多的請求會被阻塞,導致頁面加載緩慢
  • 服務器壓力過大:大量并發請求可能會給服務器帶來巨大的壓力,導致響應變慢甚至崩潰
  • 資源競爭:多個異步任務同時訪問共享資源(例如數據庫連接、文件等),可能會導致資源競爭和死鎖
  • 用戶體驗差:頁面長時間處于加載狀態,用戶體驗極差

因此,我們需要對 Promise 的并發進行控制,在保證任務執行效率的同時,避免對系統資源造成過大的壓力。

Promise.all:并行執行,統一返回

Promise.all 接收一個 Promise 數組作為參數,并行執行所有 Promise,并在所有 Promise 都 fulfilled 后,返回一個包含所有結果的數組。

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log(results); // 輸出:[1, 2, 3]
  });

適用場景: 多個異步任務之間沒有依賴關系,可以并行執行。

注意: 如果其中任何一個 Promise 被 rejected,Promise.all 會立即 rejected,并且只返回第一個 rejected 的原因。

Promise.allSettled:并行執行,返回所有狀態

Promise.allSettled 與 Promise.all 類似,也是并行執行所有 Promise,但它會等待所有 Promise 都 settled(fulfilled 或 rejected),并返回一個包含所有 Promise 狀態和結果(或原因)的數組。

const promise1 = Promise.resolve(1);
const promise2 = Promise.reject("Error");
const promise3 = Promise.resolve(3);

Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    console.log(results);
    /* 輸出:
    [
      { status: 'fulfilled', value: 1 },
      { status: 'rejected', reason: 'Error' },
      { status: 'fulfilled', value: 3 }
    ]
    */
  });

適用場景: 需要獲取所有 Promise 的執行結果,無論它們是 fulfilled 還是 rejected。

Promise.race:并行執行,誰快用誰

Promise.race 接收一個 Promise 數組作為參數,并行執行所有 Promise,只要其中任何一個 Promise settled(fulfilled 或 rejected),Promise.race 就會返回該 Promise 的結果(或原因)。

適用場景: 只需要獲取最快完成的 Promise 的結果,例如設置請求超時。

Promise.any (ES2021):并行執行,返回第一個 fulfilled

Promise.any 接收一個 Promise 數組作為參數,并行執行所有 Promise,只要其中任何一個 Promise fulfilled,Promise.any 就會返回該 Promise 的結果。如果所有 Promise 都 rejected,則返回一個 AggregateError。

適用場景: 需要獲取第一個成功的 Promise 的結果。

自定義并發控制函數:限制最大并發數

Promise.all 等方法雖然可以并行執行 Promise,但無法控制并發數量。我們可以自己實現一個函數來限制最大并發數。

使用示例:

原理:

  • tasks: 一個包含任務函數的數組,每個任務函數返回一個 Promise。
  • limit: 最大并發數。
  • results: 存儲所有任務的結果。
  • running: 存儲當前正在執行的任務(Promise)。
  • current: 指向下一個要執行的任務。
  • while 循環:只要還有任務未執行或有任務正在執行,就繼續循環。
  • if 條件:如果當前正在執行的任務數量小于 limit 且還有任務未執行,則取出下一個任務執行,并將其添加到 running 數組中。
  • task.then():監聽任務完成,將結果添加到 results 數組,并將任務從 running 數組中移除。
  • await Promise.race(running):如果當前正在執行的任務數量已達到 limit,則等待任意一個任務完成。
  • Promise.all(results): 等待所有任務執行, 并返回結果。

使用第三方庫:p-limit、async-pool 等

有一些成熟的第三方庫可以更方便地實現 Promise 并發控制,例如:

  • p-limit: 一個輕量級的 Promise 并發控制庫。

  • async-pool: 一個支持多種并發策略的 Promise 并發控制庫。

使用 Generator 函數和 yield 關鍵字

Generator 函數可以暫停和恢復執行,結合 yield 關鍵字,可以實現更細粒度的并發控制。

async function* taskGenerator(tasks) {
  for (const task of tasks) {
    yield task();
  }
}

async function runTasks(tasks, limit) {
    let pool = [];
    let results = [];
    for await (let result of taskGenerator(tasks)) {
        pool.push(result);
        results.push(result);
    if (pool.length >= limit) {
        await Promise.race(pool);
        pool = pool.filter(p => p.status != 'fulfilled' && p.status != 'rejected') // 手動維護
    }

    }
    return Promise.all(results)
}

使用消息隊列

對于非常大量的異步任務, 且允許一定的延遲, 可以使用消息隊列(例如 RabbitMQ, Kafka 等), 將任務放入隊列, 然后由多個消費者并行處理.

責任編輯:趙寧寧 來源: JavaScript
相關推薦

2025-02-07 15:01:49

Promise數組前端

2024-01-02 16:16:34

Promise前端

2024-05-13 18:33:08

SQL日期函數

2024-03-06 13:56:00

項目awaitpromise

2022-05-30 00:04:16

開源Github技巧

2024-01-26 18:04:21

編輯器Code主題

2022-05-31 09:39:40

UI網格設計

2025-02-17 08:50:00

CSS代碼JavaScript

2024-07-02 09:03:48

2023-12-09 18:02:34

工具Code插件

2025-05-09 09:26:12

2010-09-02 16:14:20

CSS布局

2023-08-07 09:12:51

權限SpringSecurity

2012-10-29 11:01:17

2025-01-10 08:38:16

2025-06-04 08:15:00

Python編程代碼

2022-05-26 00:33:29

權限TienChin項目

2024-04-01 07:51:49

Exclude?工具類型TypeScript

2023-04-10 09:15:25

Vite 4.3SWC 插件

2025-02-13 12:52:27

JavaScrip代碼開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕av免费 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 啪啪免费网站 | 欧美成人精品一区二区男人看 | 国产精品久久久久久久久图文区 | 91成人精品| 亚洲视频精品 | 成人在线中文字幕 | 一区二区在线免费播放 | 91欧美精品成人综合在线观看 | 五月婷婷在线视频 | 91社影院在线观看 | 国产视频久久 | 狠狠夜夜 | 久久久久久黄 | 亚洲欧美综合 | 毛片一级片 | 久久久久久成人 | 91久久| 日韩视频在线观看中文字幕 | 久久成人av电影 | 日韩无 | 精品成人一区二区 | 一区二区av| 国产精品国产三级国产aⅴ无密码 | 国产日韩91 | 最新日韩在线 | 天天操夜夜操 | 欧美日韩高清一区 | 亚洲综合在线网 | 日韩一区精品 | 中文字幕在线观看成人 | 欧美一级特黄aaa大片在线观看 | 久久99深爱久久99精品 | 精品视频在线免费观看 | 九九视频在线观看视频6 | 欧美性受xxx | 亚洲网站在线 | 亚洲第一区国产精品 | 亚洲欧洲视频 | 国产精品欧美一区二区三区 |