LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

在 JavaScript 中映射 Promises

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

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

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

// 期望結(jié)果:[{ name: "Adam" }, { name: "Linda" }]
// 實(shí)際結(jié)果:[Promise {<pending>}, Promise {<pending>}, ...]

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

準(zhǔn)備好了嗎?讓我們開始。

問題

想象一下:你拿到了一個(gè)需要異步處理的項(xiàng)目數(shù)組。也許這些項(xiàng)目代表 ID,你需要為每個(gè) ID 獲取數(shù)據(jù)。這是一個(gè)常見的錯(cuò)誤:

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 函數(shù)返回了一個(gè) promises 數(shù)組,并沒有等待它們解決。這不是我們想要的,并且在稍后嘗試使用 result 時(shí)可能會(huì)導(dǎo)致混亂。

for…of 循環(huán)解決方案

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

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();

如果你的目標(biāo)是順序執(zhí)行,這將更容易閱讀和理解,但要小心——這種方法可能會(huì)更慢,因?yàn)槊總€(gè)操作都等待前一個(gè)操作完成。

Promise.all 解決方案

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

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

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

processItems();

太好了!現(xiàn)在我們正在高效地工作。promises 數(shù)組被包裝在一個(gè)單一的 promise 中,它將用結(jié)果解決。好多了,并且是并發(fā)運(yùn)行的!然而,有一個(gè)問題。并發(fā)運(yùn)行 promises(例如,有 1000 個(gè)項(xiàng)目)并不總是意味著快速。它可能會(huì)變慢,并可能導(dǎo)致內(nèi)存問題。

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

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

最后,讓我們看看一個(gè)更好的并發(fā)映射方法,同時(shí)限制應(yīng)該同時(shí)運(yùn)行的 promises 數(shù)量。為此,我們將使用 npm 上的 p-map。你可以使用 npm install p-map 將其添加到你的項(xiàng)目中。

它與 Promise.all() 不同,因?yàn)槟憧梢钥刂撇l(fā)限制,并決定在出現(xiàn)錯(cuò)誤時(shí)是否停止迭代。以下是我們定義的 processItems() 函數(shù)的樣子:

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();

雖然我們在這里使用了不同的語法,但這個(gè)版本是簡潔有效的。通過設(shè)置并發(fā)限制,這種模式避免了在有大量數(shù)據(jù)時(shí)系統(tǒng)過載,并且我們可以控制在出現(xiàn)錯(cuò)誤時(shí)是否停止或繼續(xù)。有關(guān) p-map 的更多選項(xiàng),請查看 GitHub 上的文檔。

結(jié)論

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

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

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


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


閱讀原文:原文鏈接


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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲AⅤ综合在线欧美一区 亚洲另类sm视频在线观看 | 资源站色在线观看精品 | 一本久久a久久精品综合麻豆 | 亚洲日韩欧美国产高清αv 亚洲欧美高清在线观 | 亚洲国产精品久久久久 | 色综合伊人丁香五月婷婷综合缴情 |