精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為何 async/await 會“阻塞”頁面?并發處理的正確姿勢

開發
Promise.all 非常強大,但它不是唯一的工具。在不同場景下,我們還有更合適的選擇。

async/await 讓我們能用同步的方式書寫異步代碼,告別了惱人的“回調地獄”。然而,一個經典的場景常常讓開發者感到困惑:

場景: 我需要循環請求一個用戶列表,為什么用了 async/await 之后,頁面會長時間白屏,直到所有請求都完成后才顯示內容?async/await 不是非阻塞的嗎?它怎么會阻塞頁面渲染呢?

這一個問題觸及了 async/await、事件循環(Event Loop)和瀏覽器渲染機制的核心。

一、誤解澄清:await 阻塞的是什么?

首先,我們必須明確一個核心概念:

async/await 本身絕不會阻塞 JavaScript 主線程,它是一種非阻塞的語法糖

當 JavaScript 引擎遇到 await 關鍵字時,它會暫停當前 async 函數的執行,將控制權交還給主線程。主線程此時是自由的,可以去處理其他任務,比如響應用戶輸入、執行其他腳本、以及最重要的——進行頁面渲染。當 await 后面的 Promise 完成后,事件循環會再將 async 函數的后續代碼推入任務隊列,等待主線程空閑時恢復執行。

聽起來很完美,那為什么我們的頁面還是被“阻塞”了呢?

二、真正的元兇:串行執行的 await

讓我們來看看那個導致“阻塞感”的罪魁禍首代碼:

// 模擬一個 API 請求
function fetchUser(id) {
 return new Promise(resolve => {
    setTimeout(() => {
      console.log(`Fetched user ${id}`);
      resolve({ id: id, name: `User ${id}` });
    }, 1000); // 每個請求耗時 1 秒
  });
}

// 錯誤示范:在 for 循環中串行使用 await
async function fetchAllUsers(userIds) {
 console.time('Fetch All Users');
 const users = [];
 for (const id of userIds) {
    // 關鍵點:循環會在這里暫停,等待上一個請求完成后再開始下一個
    const user = await fetchUser(id);
    users.push(user);
  }
 console.timeEnd('Fetch All Users');
 // 假設這里是更新 UI 的操作
 renderUsers(users); 
 return users;
}

const userIds = [1, 2, 3, 4, 5];
fetchAllUsers(userIds); 
// 控制臺輸出:Fetch All Users: 5005.12ms

問題顯而易見: 這 5 個請求是串行的,一個接一個地執行。總耗時約等于所有請求耗時之和(5秒)。renderUsers(users) 這個最終更新 UI 的操作,必須等到這漫長的 5 秒全部結束后才能被調用。

在這 5 秒鐘內,雖然主線程沒有被 await 本身阻塞(它在 await 期間可以響應別的事件),但我們的業務邏輯人為地創造了一個漫長的等待。用戶看到的就是一個長時間不更新的頁面,這就是“阻塞感”的來源。

三、并發處理的正確姿勢:Promise.all

那么,如何將這些串行的請求變成并行的呢?這些請求之間并沒有依賴關系,完全可以同時發出!答案就是 Promise.all。

Promise.all 接收一個 Promise 數組作為參數,它會返回一個新的 Promise。這個新的 Promise 會在所有輸入的 Promise 都成功(fulfilled)后才成功,并將所有結果匯總成一個數組返回。

讓我們來改造一下上面的代碼:

總耗時從 5 秒驟降至 1 秒!這才是我們想要的效率,UI 也能更快地得到更新。

四、進階:更多并發控制工具

Promise.all 非常強大,但它不是唯一的工具。在不同場景下,我們還有更合適的選擇。

1. Promise.allSettled:不在乎失敗,只在乎結果

Promise.all 有個“缺點”:只要有一個 Promise 失敗(rejected),它就會立即失敗,并且不會返回任何已成功的結果。如果我們希望無論成功與否,都等待所有請求完成,并獲取它們各自的狀態,Promise.allSettled 是我們的不二之選。

// fetchUser(3) 會失敗
// const promises = [fetchUser(1), fetchUser(2), fetchUserThatFails(3)];
// const results = await Promise.allSettled(promises);

/* results 會是這樣:
[
  { status: 'fulfilled', value: { id: 1, ... } },
  { status: 'fulfilled', value: { id: 2, ... } },
  { status: 'rejected',  reason: 'Error: User not found' }
]
*/

2. Promise.race & Promise.any:誰快用誰

Promise.race:賽跑。返回的 Promise 會以第一個 settle(無論是成功還是失敗)的 Promise 的結果為準。適用于需要從多個源獲取數據,但只用最快返回的那個的場景(比如CDN測速)。

Promise.any:返回的 Promise 會以第一個成功(fulfilled)的 Promise 的結果為準。如果所有 Promise 都失敗了,它才會失敗。

3. 控制并發數量:避免瞬間打垮服務器

如果 userIds 的長度是 1000 呢?使用 Promise.all 會瞬間發出 1000 個請求,這可能會對我們的服務器造成巨大壓力,甚至觸發瀏覽器的并發請求數限制。

這時,我們需要一個“并發池”來控制同時進行的任務數量。我們可以手動實現一個簡單的并發控制器:

async function limitedConcurrency(tasks, limit) {
 const results = [];
 const executing = []; // 正在執行的任務

 for (const task of tasks) {
    // 1. 創建并開始一個任務的 Promise
    const p = Promise.resolve().then(() => task());
    results.push(p); // 存儲 Promise 的最終結果

    // 2. 當任務執行完畢后,從 executing 數組中移除
    if (limit <= tasks.length) {
      const e = p.then(() => executing.splice(executing.indexOf(e), 1));
      executing.push(e);
      
      // 3. 如果正在執行的任務達到上限,就等待其中一個完成
      if (executing.length >= limit) {
        await Promise.race(executing);
      }
    }
  }

 return Promise.all(results);
}

// 使用方法
const userIds = [1, 2, 3, 4, 5, 6, 7];
// 將 fetchUser 調用包裝成無參函數
const tasks = userIds.map(id => () => fetchUser(id));

// 同時只允許 3 個請求并發
limitedConcurrency(tasks, 3).then(users => {
 console.log('All users fetched with limited concurrency:', users);
});

這個函數會確保同時在“飛行”的請求數量不會超過 limit。當然,在實際項目中,我們也可以使用成熟的第三方庫來更優雅地解決這個問題。

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

2025-07-24 09:45:37

2023-05-08 11:49:05

asyncawait場景

2014-07-15 10:31:07

asyncawait

2016-11-22 11:08:34

asyncjavascript

2023-10-08 10:21:11

JavaScriptAsync

2024-05-28 08:32:18

2024-03-05 18:15:28

AsyncAwait前端

2016-10-27 17:05:32

Chrome瀏覽器

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開發

2018-01-11 15:31:39

命令Linux關機

2025-02-12 08:07:40

2012-07-22 15:59:42

Silverlight

2021-07-20 10:26:12

JavaScriptasyncawait

2022-08-27 13:49:36

ES7promiseresolve

2021-06-28 07:27:43

AwaitAsync語法

2023-07-28 07:31:52

JavaScriptasyncawait

2024-12-30 08:22:35

2017-04-10 15:57:10

AsyncAwaitPromise

2017-07-10 13:09:45

前端Flexbox
點贊
收藏

51CTO技術棧公眾號

日韩综合精品| 欧美男人天堂| 国内国产精品久久| 欧美激情xxxx性bbbb| 中文字幕人妻一区| 在线亚洲人成| 国产精品高潮久久久久无| 91免费精品视频| 日韩成年人视频| 成人精品久久| 精品国产乱码久久久久久闺蜜| 成人免费在线小视频| 东凛在线观看| 国产成人精品三级麻豆| 97婷婷大伊香蕉精品视频| 波多野在线播放| 亚洲一区网址| 欧美视频在线一区| 无码中文字幕色专区| 亚乱亚乱亚洲乱妇| 91在线视频免费91| 91精品婷婷国产综合久久蝌蚪| 天堂中文字幕在线观看| 亚洲精品国产成人影院| 亚洲欧美www| 无人码人妻一区二区三区免费| 日本精品不卡| 一区二区三区四区不卡在线| 亚洲一区二区精品在线| 男人的天堂在线| fc2成人免费人成在线观看播放 | 波多野结依一区| 亚洲国产精品国自产拍av| 国内精品久久国产| av手机免费看| 老司机午夜精品99久久| 日韩免费观看高清| 国产情侣在线视频| 欧美日韩国产色综合一二三四| 在线视频精品一| 麻豆国产精品一区| 超碰精品在线观看| 欧美一区二区三区四区久久| 美女喷白浆视频| 小草在线视频免费播放| 亚洲国产另类av| 成人高清dvd| 黄网站免费在线观看| 国产日产欧美一区| 欧美精品与人动性物交免费看| 六月婷婷中文字幕| 高潮精品一区videoshd| 99久久99| 亚洲国产精彩视频| 懂色av中文一区二区三区| 91免费精品国偷自产在线| 国产美女三级无套内谢| 国内精品伊人久久久久av影院| 国产精品久久中文| 欧美激情一区二区三区免费观看| 日韩国产精品久久久久久亚洲| 国产91精品久久久久| 国产精品自拍99| 美女精品一区| 日本欧美一二三区| 天干夜夜爽爽日日日日| 久久字幕精品一区| 国产精品美女呻吟| 国产又黄又大又爽| 国产·精品毛片| 久久综合九色综合久99| 成人免费在线电影| 国产精品不卡一区| 成人av在线不卡| 第四色日韩影片| 欧美午夜女人视频在线| 激情五月亚洲色图| 欧美xxxx做受欧美护士| 欧美老年两性高潮| 国产大尺度视频| 日韩激情啪啪| 国产日韩v精品一区二区| 欧美日韩一区不卡| 国产一区二区三区精彩视频| 欧美大片1688网站| 91精品国产一区二区三区蜜臀| 日本黄色一级网站| 日韩美女国产精品| 日韩在线资源网| 久久精品美女视频| 性欧美精品高清| 国产一区欧美二区三区| a在线观看视频| ww亚洲ww在线观看国产| 亚洲三区四区| 97天天综合网| 欧美三级中文字幕在线观看| 激情小说欧美色图| 免费视频亚洲| 欧美美女操人视频| 日韩精品一区二区亚洲av观看| 韩国一区二区在线观看| 精品乱色一区二区中文字幕| 91官网在线| 婷婷综合另类小说色区| 999精品视频在线| 国产精品丝袜在线播放| 日韩中文字幕在线观看| 日韩欧美三级在线观看| 狠狠色狠狠色综合日日91app| 狠狠色狠狠色综合人人| 思思99re6国产在线播放| 午夜精品久久久久久久蜜桃app| 人妻丰满熟妇av无码区app| av不卡一区| 日韩中文在线视频| 啦啦啦免费高清视频在线观看| 激情综合网激情| 欧美深深色噜噜狠狠yyy| 亚洲妇熟xxxx妇色黄| 色婷婷av久久久久久久| 在线xxxxx| 中文字幕人成人乱码| 国产不卡在线观看| 色婷婷av一区二区三| 亚洲精品中文在线| 欧美日韩在线观看不卡| 亚洲伊人春色| 91国产美女视频| 亚洲AV无码精品自拍| 亚洲日本丝袜连裤袜办公室| 一本色道无码道dvd在线观看| 国产主播性色av福利精品一区| 精品国产拍在线观看| 欧美成人一区二区视频| 国产日韩成人精品| 免费观看成人网| 国产精品视频一区二区三区四蜜臂| 久久久久久久久久av| 99免费在线视频| 亚洲人一二三区| 污污网站在线观看视频| 欧美一区二区三区激情视频| 国产成人精品亚洲精品| 桃花色综合影院| 岛国视频午夜一区免费在线观看| 在线播放av网址| 亚洲视频日本| 国产精品久久一区二区三区| 日本无删减在线| 精品国产伦一区二区三区观看体验| 国产性xxxx| 国产大片一区二区| 欧美另类videosbestsex日本| 二区三区精品| 九九热r在线视频精品| av在线亚洲天堂| 亚洲欧美日韩一区二区三区在线观看 | 日韩免费中文字幕| 你懂得在线网址| 一本久道久久综合中文字幕| 免费一级做a爰片久久毛片潮| 久久一区激情| 午夜午夜精品一区二区三区文| 99久久久国产精品免费调教网站| 日韩中文在线视频| 精品国产乱码一区二区三 | 热久久最新地址| 亚洲一区二区三区免费| 97在线视频一区| 免费a级毛片在线观看| 欧美视频中文字幕| 国产一区二区视频在线观看免费| 国产高清在线精品| 波多野结衣综合网| 真实原创一区二区影院| 国产精品一区二区三区久久久| 成人日日夜夜| 亚洲国产黄色片| 国产裸体美女永久免费无遮挡| 国产精品污污网站在线观看| 手机在线免费毛片| 亚洲激情在线| 天堂精品视频| 日韩一区二区三区色| 91国内在线视频| 97在线观看免费观看高清| 欧美一区二区高清| 国产精品999在线观看| 国产农村妇女精品| 精品无码av一区二区三区| 另类av一区二区| 中文字幕免费高| 人人精品亚洲| 国产欧美日韩专区发布| 春色校园综合激情亚洲| 在线日韩av观看| 欧美一区二区黄片| 欧美日韩一二区| 日韩免费观看一区二区| 中文字幕一区免费在线观看| 性活交片大全免费看| 日韩二区在线观看| a级黄色片免费| 精品国产欧美日韩| 不卡一卡2卡3卡4卡精品在| 日本少妇一区| 性色av一区二区咪爱| 日韩伦理在线观看| 亚洲丝袜一区在线| 亚洲欧美强伦一区二区| 欧美影视一区在线| 亚洲欧美在线视频免费| 亚洲欧洲精品成人久久奇米网| 六十路息与子猛烈交尾| 国产精品一品视频| 亚洲一级片免费| 欧美专区一区二区三区| 天天综合五月天| 日韩电影免费在线观看| 欧美高清性xxxxhd | 久久99精品久久久久久动态图| 日韩精品xxxx| 韩国自拍一区| 五月天激情图片| 日本不卡免费一区| 欧美日韩另类综合| 日韩av不卡一区| 国产福利久久| 久久精品一级| 91精品中文在线| 激情欧美一区二区三区黑长吊| 日韩免费观看高清| 成人教育av| 18性欧美xxxⅹ性满足| www.综合网.com| 欧美极品少妇与黑人| 在线观看av免费| 欧美大奶子在线| √天堂8在线网| 久久av.com| av免费在线网站| 美女999久久久精品视频| 麻豆视频在线| 久久精彩免费视频| 老司机在线永久免费观看| 中文综合在线观看| 在线a免费看| 日韩中文字幕免费视频| 免费人成在线观看播放视频 | 免费看污久久久| 小嫩嫩12欧美| 日本不卡一区二区三区视频| 国产精品手机在线播放| 日韩精品欧美专区| 精品一区二区三区在线| 日韩欧美一区二区三区四区| 狠狠色丁香婷婷综合影院| 日产精品高清视频免费| 超碰成人久久| 宅男噜噜99国产精品观看免费| 国产精品久久久久久久免费观看 | 一本不卡影院| 日本一本二本在线观看| 日产国产高清一区二区三区| 亚洲福利精品视频| 国产一区欧美一区| 95视频在线观看| 久久影院视频免费| 国产精品www爽爽爽| 国产精品久线在线观看| 久热这里有精品| 亚洲国产精品一区二区www | 久久亚洲欧洲| 久久人人爽av| 高清视频一区二区| 四虎永久免费影院| 国产精品国产自产拍高清av王其 | 中文字幕在线视频播放| 99re8在线精品视频免费播放| 波多野结衣福利| 亚洲欧洲韩国日本视频| 久久精品无码人妻| 在线视频你懂得一区二区三区| 国产又粗又黄又爽视频| 亚洲国产精品免费| 国产一区电影| 欧美精品免费播放| 欧美亚洲韩国| 亚洲在线免费观看| 伊人久久大香线蕉综合网站| 中文字幕色一区二区| 亚洲一级二级| 777一区二区| 91在线观看视频| 黑人操日本美女| 欧美色道久久88综合亚洲精品| 在线观看国产一区二区三区| 精品国产乱码91久久久久久网站| 国产有码在线| 午夜精品三级视频福利| 未满十八勿进黄网站一区不卡| 国产一区二区在线观看免费播放| 日韩精品久久| 亚洲 高清 成人 动漫| 久久99国产精品免费网站| 91精彩刺激对白露脸偷拍| 综合婷婷亚洲小说| 蜜臀99久久精品久久久久小说| 日韩精品一区二区三区中文不卡| 国产在线观看免费网站| 97在线看福利| 亚洲三级av| 椎名由奈jux491在线播放| 欧美亚洲一区| 漂亮人妻被黑人久久精品| 亚洲色图在线看| 中文字幕视频二区| 日韩电影中文字幕一区| 久草免费在线色站| 91免费精品视频| 成人免费av| www.日本xxxx| 久久精品综合网| 日本网站在线免费观看| 日韩一区二区电影网| 欧美a免费在线| 国产欧美va欧美va香蕉在| 夜夜春成人影院| 日韩精品 欧美| 成人国产视频在线观看| 国产精品白嫩白嫩大学美女| 欧美日韩在线综合| 国产www.大片在线| 欧美又大又粗又长| 女同久久另类99精品国产| www污在线观看| 国产99精品国产| 久久久精品91| 日韩久久免费av| 调教一区二区| 国产v亚洲v天堂无码| 午夜精品婷婷| 佐佐木明希电影| 亚洲国产精品久久一线不卡| 性猛交富婆╳xxx乱大交天津 | 日本福利视频导航| 免费不卡在线观看| 精品人体无码一区二区三区| 欧美性受xxxx| √新版天堂资源在线资源| 国产精品网红直播| 91日韩免费| 国产调教打屁股xxxx网站| 一区二区三区在线视频观看58| 精品人妻一区二区三区含羞草| 欧美激情精品久久久久久黑人| 超碰97久久| 国产裸体舞一区二区三区| 亚洲国产精品传媒在线观看| 国产精品午夜一区二区| 中文字幕一区日韩电影| 精品一区二区三区中文字幕在线 | 成人动漫中文字幕| 日韩精品一区二区不卡| 亚洲女人被黑人巨大进入| 69堂免费精品视频在线播放| 亚洲一区二区在线看| 国产精品亚洲а∨天堂免在线| 日韩免费一二三区| 日韩精品在线播放| 91精品店在线| 国产一二三四五| fc2成人免费人成在线观看播放| 日日夜夜操视频| zzijzzij亚洲日本成熟少妇| 91蜜桃臀久久一区二区| 国产欧美在线一区| 一区在线中文字幕| 亚洲国产精品国自产拍久久| 欧洲亚洲免费在线| 天天射天天综合网| 天堂www中文在线资源| 在线一区二区视频| www.欧美日本韩国| 蜜桃成人免费视频| 国产一区二区精品在线观看| 伊人久久综合视频| 中文字幕久久久av一区| 超碰97久久国产精品牛牛| 另类小说第一页| 亚洲一区在线电影| 国内精品在线视频| 97se亚洲综合在线| 久久亚洲一区| 国产精品99re| www.欧美精品| 台湾佬综合网| 91精品人妻一区二区三区蜜桃2| 91官网在线观看|