日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

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

你在 forEach 里寫的 await,其實(shí)根本沒在等!

admin
2025年7月1日 9:36 本文熱度 450

forEach和 async/await的這個(gè)組合,就像一對(duì)貌合神離的“情侶”,看起來般配,實(shí)則互相“背叛”。這個(gè)坑,我結(jié)結(jié)實(shí)實(shí)地踩過,而且不止一次。

故事的開始:一個(gè)看似無害的需求

想象一下,接到一個(gè)需求:批量更新一組用戶的狀態(tài)。后端提供了一個(gè)接口 updateUser(userId),它是一個(gè)返回 Promise 的異步函數(shù)。第一反應(yīng)可能就是這樣寫:

const userIds = [1, 2, 3, 4, 5];

async function updateUserStatus(id) {
 console.log(`開始更新用戶 ${id}...`);
 // 模擬一個(gè)需要 1 秒的網(wǎng)絡(luò)請(qǐng)求
 await new Promise(resolve => setTimeout(resolve, 1000)); 
 console.log(`? 用戶 ${id} 更新成功!`);
 return { success: true };
}

async function batchUpdateUsers(ids) {
 console.log("--- 開始批量更新 ---");

  ids.forEach(async (id) => {
    await updateUserStatus(id);
  });

 console.log("--- 所有用戶更新完畢!---"); // ?? 問題的根源在這里!
}

batchUpdateUsers(userIds);

運(yùn)行這段代碼,控制臺(tái)輸出了什么?不是期望的按順序等待,而是這樣的結(jié)果:

看到了嗎?“所有用戶更新完畢!”這句話幾乎是立即打印出來的,它根本沒有“等待”任何 updateUserStatus函數(shù)的完成。

問題剖析:forEach到底干了什么?

forEach被設(shè)計(jì)為同步迭代器。它的工作很簡(jiǎn)單:遍歷數(shù)組中的每個(gè)元素,并為每個(gè)元素同步地調(diào)用你提供的回調(diào)函數(shù)。它不關(guān)心你的回調(diào)函數(shù)是同步的還是異步的,也不關(guān)心它返回什么。

換句話說,forEach的內(nèi)心獨(dú)白是:

“我的任務(wù)就是觸發(fā),觸發(fā),再觸發(fā)。至于你傳進(jìn)來的那個(gè) async函數(shù)什么時(shí)候執(zhí)行完?抱歉,那不歸我管,我不會(huì)等它的?!?/span>


正確的姿勢(shì):如何真正地“等待”?

既然 forEach不行,那我們?cè)撚檬裁??答案是使用那些“懂?Promise 的循環(huán)方式。

方案一:老實(shí)人 for...of循環(huán)(順序執(zhí)行)

如果我們需要按順序、一個(gè)接一個(gè)地執(zhí)行異步操作,for...of循環(huán)是你的最佳選擇。它是 async/await的天作之合。

async function batchUpdateUsersInOrder(ids) {
  console.log("--- 開始批量更新 (順序執(zhí)行) ---");

  for (const id of ids) {
    // 這里的 await 會(huì)實(shí)實(shí)在在地暫停 for 循環(huán)的下一次迭代
    await updateUserStatus(id); 
  }

  console.log("--- 所有用戶更新完畢!(這次是真的) ---");
}

運(yùn)行結(jié)果:

這完全符合我們的直覺:等待上一個(gè)完成后,再開始下一個(gè)。

方案二:效率先鋒 Promise.allmap(并行執(zhí)行)

在很多場(chǎng)景下,我們并不需要嚴(yán)格地按順序執(zhí)行。這些異步任務(wù)之間沒有依賴關(guān)系,完全可以并行處理以提高效率。這時(shí),map和 Promise.all的組合就閃亮登場(chǎng)了。

  1. Array.prototype.map:與 forEach不同,map會(huì)返回一個(gè)新數(shù)組。當(dāng)我們給它一個(gè) async函數(shù)時(shí),它會(huì)同步地返回一個(gè)由 pendingPromise 組成的數(shù)組。
  2. Promise.all:這個(gè)方法接收一個(gè) Promise 數(shù)組,并返回一個(gè)新的 Promise。只有當(dāng)數(shù)組中所有的 Promise 都成功完成(resolved)時(shí),這個(gè)新的 Promise 才會(huì)完成。
async function batchUpdateUsersInParallel(ids) {
 console.log("--- 開始批量更新 (并行執(zhí)行) ---");

 // 1. map 會(huì)立即返回一個(gè) Promise 數(shù)組
 const promises = ids.map(id => updateUserStatus(id));

 // 2. Promise.all 會(huì)等待所有 promises 完成
 await Promise.all(promises);

 console.log("--- 所有用戶更新完畢!(這次是真的,而且很快) ---");
}

運(yùn)行結(jié)果:

這種方式的總耗時(shí)約等于最慢的那個(gè)異步任務(wù)的耗時(shí),效率極高。

方案三:更靈活的 for...in和傳統(tǒng) for循環(huán)

for...in(用于遍歷對(duì)象鍵)和傳統(tǒng)的 for (let i = 0; ...)循環(huán)同樣支持 await。它們的工作方式與 for...of類似,都會(huì)等待 await的 Promise 完成。

// 傳統(tǒng) for 循環(huán)
for (let i = 0; i < ids.length; i++) {
  await updateUserStatus(ids[i]);
}

為了防止你和我一樣踩坑,這里有一份速記備忘錄:需要按順序執(zhí)行使用 for...of;需要并行執(zhí)行,提高效率使用 Promise.allmap,性能最佳,但要注意并發(fā)數(shù)過高可能帶來的問題;絕對(duì)不要用 forEach,它不會(huì)等待我們的 await,它只會(huì)無情地觸發(fā)。


閱讀原文:https://mp.weixin.qq.com/s/QUynwSg3aBjzsNo5WttXDQ


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

粉嫩久久| avTTtt天天天天天天| 优优成人综合网| 男人天堂AV2028| 国产精品一二三区夜夜躁| 欧美长片一区| 夜夜躁久久夜夜爽| 久久国产最部对白| 冈江禀一区二区三区在线播放| 午夜俩性色| 18禁免费网址| 美女视频网站免费| 欧美 国产 乱伦 一区 3P| 色七七激情综合网| 国产在线欧美大香蕉| 999色激情| 久久综合日韩图片| 亚州日韩欧美久久| 婷婷五月天激情国产| 亚洲中文字幕久久无码一区二区三区 | 天天搞天天爽天天日| 亚洲久久九九欧美| 国产精品秘密麻豆| 国产91三级精品主播最新在线| 免费黄色影片av| 伊人色色伊人| 91噜噜综合网页一区| 欧美日韩久久夜夜一区| 久久不卡香蕉视频| 在线国产欧美一区| 一级天天操夜夜操| 禹城市| AV成人网址第一导航| 欧美一级黄片视频欧美| 国产欧美日韩在线观看xxx黑人| 亚洲丝袜美腿一区二区三区| 亚洲一区在线偷拍| 巨型ww国产| 久久综合亚洲麻豆| 日韩狠狠色| 香港伦理性感女教师在线播放网站 |