精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

在 JavaScript 中映射 Promises

admin
2024年12月30日 21:15 本文熱度 271

你是否遇到過這樣的情況:你期望你的 map 函數返回一個已解決/等待的值,但它卻返回了一個包含多個 promises 的列表。例如:

const result = ids.map(async (id) => {
  return await fetch(id);
});

// 期望結果:[{ name: "Adam" }, { name: "Linda" }]
// 實際結果:[Promise {<pending>}, Promise {<pending>}, ...]

你并不孤單。我在配對編程中也遇到過這種情況幾次。本文將展示如何在 async/await 操作中進行映射。

準備好了嗎?讓我們開始。

問題

想象一下:你拿到了一個需要異步處理的項目數組。也許這些項目代表 ID,你需要為每個 ID 獲取數據。這是一個常見的錯誤:

const ids = [12345];

const fetchData = async (id) => {
  // 模擬異步獲取操作
  return `data for ${id}`;
};

const processItems = async () => {
  const result = ids.map(async (id) => {
    return await fetchData(id);
  });

  console.log(result); // [Promise {<pending>}, Promise {<pending>}, ...]
};

processItems();

好的,這里出了什么問題呢??? map 函數返回了一個 promises 數組,并沒有等待它們解決。這不是我們想要的,并且在稍后嘗試使用 result 時可能會導致混亂。

for…of 循環解決方案

一種方法是使用 for...of 循環。如果你的異步操作需要按順序發生而不是并行執行,這將非常有用。

const processItemsSequentially = async () => {
  const result = [];
  for (const id of ids) {
    const data = await fetchData(id);
    result.push(data);
  }

  console.log(result); // ['data for 1', 'data for 2', ...]
};

processItemsSequentially();

如果你的目標是順序執行,這將更容易閱讀和理解,但要小心——這種方法可能會更慢,因為每個操作都等待前一個操作完成。

Promise.all 解決方案

讓我們使用 Promise.all 和 Array.prototype.map() 來清理這個問題。這個巧妙的方法可以將我們的 promises 數組包裝成一個單一的 promise,當所有 promises 解決時,它將解決。

const processItems = async () => {
  const result = await Promise.all(
    ids.map((id) => {
      return fetchData(id);
    })
  );

  console.log(result); // ['data for 1', 'data for 2', ...]
};

processItems();

太好了!現在我們正在高效地工作。promises 數組被包裝在一個單一的 promise 中,它將用結果解決。好多了,并且是并發運行的!然而,有一個問題。并發運行 promises(例如,有 1000 個項目)并不總是意味著快速。它可能會變慢,并可能導致內存問題。

提示:你可以選擇在這個例子中使用 promise.all() 或 promise.allSettled()。

使用 p-map 的更清晰解決方案

最后,讓我們看看一個更好的并發映射方法,同時限制應該同時運行的 promises 數量。為此,我們將使用 npm 上的 p-map。你可以使用 npm install p-map 將其添加到你的項目中。

它與 Promise.all() 不同,因為你可以控制并發限制,并決定在出現錯誤時是否停止迭代。以下是我們定義的 processItems() 函數的樣子:

import pMap from 'p-map';
const ids = [12345];

const fetchData = async (id: number) => {
  // 模擬異步獲取操作
  return `data for ${id}`;
};

const processItems = async () => {
  const result = await pMap(ids, (id) => fetchData(id), { concurrency2 });

  console.log(result); // ['data for 1', 'data for 2', ...]
};

processItems();

雖然我們在這里使用了不同的語法,但這個版本是簡潔有效的。通過設置并發限制,這種模式避免了在有大量數據時系統過載,并且我們可以控制在出現錯誤時是否停止或繼續。有關 p-map 的更多選項,請查看 GitHub 上的文檔。

結論

就是這樣,朋友們!我們探討了在映射 promises 時的一個常見錯誤,并涵蓋了三種有效的解決方案:

  1. 使用 for...of 進行順序操作 ??
  2. 使用 Promise.all 進行并行執行 ????
  3. 使用 p-map 模塊的更清晰解決方案 ??

我希望這能幫助你成為一個Promise映射專家!編碼愉快!??


原文地址:https://www.telerik.com/blogs/mapping-promises-javascript


閱讀原文:原文鏈接


該文章在 2024/12/31 11:37:53 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产猛男猛女超爽免费视频 | 亚洲另类国产 | 国语对白精品视频在线观看 | 忘忧草一卡二卡三卡 | 午夜dj高清在线观看免费8 | 老熟妇乱子交视频一区 | 欧美成人免费全部 | 好爽插我添我BB | 欧美日韩视频一区中文字幕 | 国产精品免费无遮挡无码永久视频亚洲爆乳无码一区二区三区 | 69国人色插操 | 中日韩va无码 | 亚洲av日韩综合一区尤物 | 亚洲一区二区三区视频 | 无码人妻久久久一 | 国产精品无码dvd在线观看 | 亚洲国产成人aⅴ | 国产AV一区二区三区天堂综合网 | 91麻豆影视| 亚洲欧美另类一区二区 | 无码av人妻精 | 国产毛片日韩精品无码 | 久久婷婷五月综合色奶水99啪 | 亚洲精品久久久久久久蜜桃 | 乳乱公伦爽到爆 | 一区二区三区四区免费毛片 | 久久精品熟女亚洲AV国产 | 欧美精品黑人粗大免费 | 四虎国产精品成人无码 | 亚洲国产精品一区二区三区久久 | 91精品国产91综合久久蜜臀 | 日韩人妻视频免费公开 | 国产精品v免费视频 | 亚洲色网视频一区 | 麻豆av在线免费观看精品 | 国产成人一区免费观看 | 亚洲视频精品国产日韩一区二区 | 亚洲成人免费电影 | 亚洲综合另类图片五月天 | 另类国产ts人妖视频网站 | 国产免费福利在线视频 |