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

解決async/await頁面卡頓:理解并發處理的正確方法

開發 前端
掌握這些并發處理技巧,你就能充分利用async/await的優勢,寫出既高效又不會讓用戶感覺頁面卡頓的JavaScript代碼了。

你可能遇到過這種情況:你在JavaScript中使用了async/await來處理異步操作,比如循環請求用戶列表數據,結果頁面卻長時間白屏,直到所有請求都完成后才顯示內容。這讓你感到困惑:不是說async/await是非阻塞的嗎?它怎么會讓頁面卡住呢?

這個問題觸及了async/await、瀏覽器任務處理和頁面渲染的核心機制。讓我們一步步搞清楚。

誤解澄清:await 到底會不會阻塞?

先說最重要的:async/await本身不會阻塞瀏覽器的JavaScript主線程。 它只是讓寫異步代碼看起來像寫同步代碼的一種方式。

當JavaScript引擎碰到await關鍵字時,它會暫停當前async函數的執行,把控制權交還給瀏覽器的主線程。

這時主線程是空閑的,它可以去做其他事情:響應用戶的點擊、滾動,運行其他腳本代碼,還有最重要的——更新頁面顯示(渲染)。

等到await后面的那個操作(通常是一個Promise)完成后,瀏覽器會在合適的時候(主線程空閑時)把這個async函數暫停的地方繼續執行下去。

聽起來很完美?那為什么頁面還是卡住了呢?

真正的罪魁禍首:一個接一個的等待

問題往往出在代碼怎么寫上。看看下面這個常見的錯誤例子:

// 模擬一個獲取用戶數據的api請求
functionfetchUser(id) {
returnnewPromise(resolve => {
setTimeout(() => {
console.log(`獲取到用戶 ${id}`); // 模擬網絡請求
      resolve({ id: id, name: `用戶 ${id}` });
    }, 1000); // 假設每個請求需要1秒鐘
  });
}

// 錯誤做法:在循環里一個接一個地等
asyncfunctiongetAllUsers(userIds) {
console.time('獲取所有用戶耗時');
const users = [];
for (const id of userIds) {
// 關鍵問題:這里會停下來等,等上一個請求徹底完成,才會開始下一個
const user = await fetchUser(id);
    users.push(user);
  }
console.timeEnd('獲取所有用戶耗時');
// 假設這里是把用戶數據顯示到頁面上
  showUsers(users);
return users;
}

const userIds = [1, 2, 3, 4, 5];
getAllUsers(userIds);
// 控制臺輸出:獲取所有用戶耗時: 約5000毫秒

問題很明顯:這5個請求是一個接一個執行的。

第一個請求發出后,代碼就停下來等它1秒完成,然后才開始第二個請求,再等1秒,如此反復。

總共花了差不多5秒鐘。而更新頁面顯示的那個showUsers(users)函數,必須等到這漫長的5秒全部結束后才會被調用。

在這5秒里,雖然瀏覽器的主線程在每次await等待時確實可以去處理別的事情(比如你點了按鈕它可能還能響應)。

但因為你的代碼邏輯就是讓所有事情排隊做,頁面在等待期間沒有任何新內容可以顯示。

用戶看到的就是一個長時間空白或內容不更新的頁面,感覺就像頁面“卡死”了。

解決之道:讓請求一起 - Promise.all

如果這些請求之間不需要等對方的結果(比如獲取用戶1的數據不需要先知道用戶2的數據),那完全可以讓它們同時發出去!這就是Promise.all的用武之地。

Promise.all接收一個包含多個Promise(代表那些異步操作)的數組。它自己返回一個新的Promise。

這個新Promise會等到數組里所有的Promise都成功完成(resolved)后,才成功,并把所有結果打包成一個數組給你。

改造上面的代碼:

asyncfunctiongetAllUsersFast(userIds) {
console.time('并行獲取所有用戶耗時');
// 1. 創建請求數組:每個元素都是 fetchUser(id) 調用返回的Promise
const userPromises = userIds.map(id => fetchUser(id));

// 2. 使用 Promise.all 等待所有請求完成
const users = awaitPromise.all(userPromises);

console.timeEnd('并行獲取所有用戶耗時'); // 輸出:約1000毫秒
  showUsers(users);
return users;
}

getAllUsersFast(userIds);

效果立竿見影!總時間從5秒縮短到了大約1秒(取決于最慢的那個請求)。頁面也能更快地顯示出用戶數據,用戶體驗好得多。

更多實用工具:不同場景用不同方法

Promise.all很強大,但并不是唯一的選擇。根據你的具體需要,還有其他好幫手:

1.Promise.allSettled:每個都要結果,不管成功失敗如果有些請求可能會失敗,但你不想讓一個失敗就中斷所有,還想知道每個請求最終是成功還是失敗了,用Promise.allSettled。

asyncfunctiongetUsersWithStatus(userIds) {
const promises = userIds.map(id => fetchUser(id).catch(error => error)); // 捕獲錯誤,避免整個Promise.allSettled失敗
const results = awaitPromise.allSettled(promises);

// 處理結果:results 是一個數組,每個元素是對象
// { status: 'fulfilled', value: 結果 } 或 { status: 'rejected', reason: 錯誤原因 }
  results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('成功:', result.value);
    } else {
console.log('失敗:', result.reason);
    }
  });
return results; // 或者根據 status 過濾出成功的數據
}

2.Promise.race 和 Promise.any:誰快用誰
1)Promise.race: 只要數組里有一個Promise完成(無論是成功還是失敗),它就立刻完成,結果或錯誤就是那個最快的Promise的。
適合做超時控制或者從多個來源取最快響應(比如測哪個CDN快)。

asyncfunctiongetFirstResponse() {
const timeoutPromise = newPromise((_, reject) =>setTimeout(() => reject(newError('超時!')), 500));
const dataPromise = fetchUser(1);

try {
const result = awaitPromise.race([dataPromise, timeoutPromise]);
console.log('成功獲取數據:', result);
  } catch (error) {
console.log('出錯或超時:', error.message);
  }
}

2)Promise.any: 等待第一個成功完成的Promise。只有數組里所有的Promise都失敗了,它才失敗。適合需要嘗試多個途徑,只要有一個成功就行。

asyncfunctiongetFromAnySource(sources) {
try {
const firstSuccess = awaitPromise.any(sources.map(source => fetch(source)));
console.log('從最快成功的源獲取:', firstSuccess);
  } catch (errors) { // 注意:錯誤是 AggregateError
console.log('所有源都失敗了:', errors);
  }
}

3)控制同時請求的數量:別把服務器壓垮如果你的用戶ID列表有1000個,用Promise.all會瞬間發出1000個請求。

這可能會讓你的服務器崩潰,或者被瀏覽器限制(瀏覽器通常對同一域名有并發請求數限制,比如6-8個)。

這時候你需要一個“池子”來控制同時進行的請求數量。這里提供一個簡單但有效的實現方法:

asyncfunctionrunWithConcurrency(tasks, maxConcurrent) {
const results = []; // 存放所有任務的最終結果(Promise)
const activeTasks = []; // 當前正在執行的任務對應的Promise(用于跟蹤)

for (const task of tasks) {
// 1. 創建代表當前任務的Promise。`() => task()` 確保任務在需要時才啟動
const taskPromise = Promise.resolve().then(task);
    results.push(taskPromise); // 保存結果,最后統一用 Promise.all 等

// 2. 創建任務完成后的清理操作:從 activeTasks 中移除自己
const removeFromActive = () => activeTasks.splice(activeTasks.indexOf(removeFromActive), 1);
    activeTasks.push(removeFromActive); // 注意:這里存的是清理函數對應的Promise

// 3. 如果當前活躍任務數已達上限,就等任意一個完成
if (activeTasks.length >= maxConcurrent) {
awaitPromise.race(activeTasks); // 等 activeTasks 數組里任意一個Promise完成
    }

// 4. 將清理操作與實際任務完成掛鉤
    taskPromise.then(removeFromActive, removeFromActive); // 無論成功失敗都清理
  }

// 5. 等待所有任務完成(無論是否在活躍池中)
returnPromise.allSettled(results); // 或者用 Promise.all(results) 只關心成功
}

// 使用示例
const userIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 將 fetchUser(id) 調用包裝成無參數的函數數組
const tasks = userIds.map(id =>() => fetchUser(id));

// 最多同時發出 3 個請求
runWithConcurrency(tasks, 3).then(results => {
console.log('所有用戶獲取完成 (并發控制):', results);
});

這個函數會確保最多只有maxConcurrent個請求同時在進行。

當一個請求完成,池子里有空位了,才會開始下一個請求。在實際項目中,你也可以使用成熟的庫如 p-limit 或 async 的 queue 方法來實現更強大的并發控制。

關鍵總結

  • async/await 本身不會阻塞瀏覽器主線程
  • 頁面卡頓通常是因為代碼邏輯(如在循環中串行await)導致了不必要的長時間等待
  • 對于獨立的異步任務(如多個API請求),使用 Promise.all 讓它們并行執行是大幅提升速度和用戶體驗的關鍵。
  • 根據需求選擇工具:Promise.allSettled(都要結果)、Promise.race/Promise.any(用最快的)、手動或庫實現的并發控制(防服務器過載)。
  • 理解瀏覽器的事件循環和渲染機制有助于寫出更流暢的代碼。記住:長時間的同步邏輯(包括在async函數里連續await造成的等待)會推遲渲染。

掌握這些并發處理技巧,你就能充分利用async/await的優勢,寫出既高效又不會讓用戶感覺頁面卡頓的JavaScript代碼了。

責任編輯:龐桂玉 來源: web前端開發
相關推薦

2025-07-21 10:00:00

JavaScript線程開發

2016-11-22 11:08:34

asyncjavascript

2023-05-08 11:49:05

asyncawait場景

2024-09-02 14:12:56

2017-08-02 14:17:08

前端asyncawait

2014-07-15 10:31:07

asyncawait

2012-05-30 15:40:16

大并發并發解決方案

2023-10-08 10:21:11

JavaScriptAsync

2024-03-05 18:15:28

AsyncAwait前端

2024-06-25 08:33:48

2021-06-28 08:10:59

JavaScript異步編程

2016-10-27 17:05:32

Chrome瀏覽器

2024-01-29 00:35:00

Go并發開發

2024-02-02 15:21:08

工具頁面性能

2024-06-03 08:22:33

微信小程序頁面切換刪除定位法

2012-07-22 15:59:42

Silverlight

2021-07-20 10:26:12

JavaScriptasyncawait

2022-08-27 13:49:36

ES7promiseresolve

2017-04-10 15:57:10

AsyncAwaitPromise

2021-06-28 07:27:43

AwaitAsync語法
點贊
收藏

51CTO技術棧公眾號

欧美日韩在线免费播放| 国产一区二区三区高清| 五月天激情丁香| 高潮按摩久久久久久av免费| 欧美色图在线视频| 亚洲一区二区高清视频| 性中国古装videossex| 欧美亚洲在线| 久久婷婷国产麻豆91天堂| 日本不卡视频一区| 在线一区视频观看| 亚洲午夜一二三区视频| 日本免费高清不卡| 成人av一区二区三区在线观看| 亚洲免费网址| 欧美日本国产在线| 色欲狠狠躁天天躁无码中文字幕| 久久精品一级| 欧美伊人精品成人久久综合97| 国产视频在线观看网站| 丁香婷婷在线观看| 成人18精品视频| 91精品中文在线| 影音先锋在线国产| 黄色国产精品| 久久久精品亚洲| 免费网站在线高清观看| 国产精品一区二区三区美女| 欧美精品电影在线播放| 亚洲精品乱码久久久久久自慰| 直接在线观看的三级网址| 国产三级精品三级在线专区| 精品一区二区日本| 亚洲老妇色熟女老太| 久久99久久久欧美国产| 国产精品久久婷婷六月丁香| 日韩精品久久久久久久酒店| 欧美日韩亚洲一区在线观看| 久久视频免费在线播放| 欧美激情 一区| 国产一区二区电影在线观看| 日韩乱码在线视频| 好吊色视频一区二区三区| 日韩在线精品强乱中文字幕| 欧美一区二区三区日韩视频| 一区二区三区 欧美| 桃花岛tv亚洲品质| 色8久久人人97超碰香蕉987| 欧美 国产 小说 另类| 国产理论在线| 欧美日韩亚洲国产一区| 草草久久久无码国产专区| 欧美巨大丰满猛性社交| 午夜不卡在线视频| 伊人成色综合网| 日韩av影片| 欧美午夜影院在线视频| 久久综合狠狠综合久久综青草| 日韩中文在线中文网在线观看| 免费在线观看亚洲视频| 国产乱码午夜在线视频| 精品久久久香蕉免费精品视频| 欧美激情视频免费看| av电影免费在线看| 午夜影院久久久| 北条麻妃在线视频观看| www.成人影院| 欧美三日本三级三级在线播放| 激情视频免费网站| www.久久99| 欧美mv和日韩mv的网站| 日本少妇xxxx| 日韩极品在线| 一区二区日韩精品| 国产精品女主播视频| 性做爰过程免费播放| 超碰个人在线| 亚洲五码中文字幕| 日韩av黄色网址| 国产欧美一区二区三区在线看蜜臂| 精品福利av| 日本中文字幕成人| 在线观看免费视频a| 国产综合色视频| 国严精品久久久久久亚洲影视| 日本福利片在线| 中文字幕制服丝袜成人av | 人人澡人人澡人人看欧美| 无码人妻精品一区二区三区蜜桃91| 蜜臀av性久久久久蜜臀aⅴ流畅| 91久久国产精品91久久性色| 亚洲欧美另类综合| 久久久五月婷婷| 波多野结衣 作品| 亚洲午夜天堂| 日韩视频中午一区| 天天躁日日躁aaaa视频| 欧美高清一区| 国产精品第2页| 丁香六月天婷婷| 国产色91在线| 全黄性性激高免费视频| 日本在线中文字幕一区二区三区| 日韩视频免费观看高清完整版| 欧美色图亚洲激情| 欧美国产三区| 国产精品久久久久77777| xxxx18国产| 亚洲国产精品精华液2区45| 欧美视频在线观看视频| 日韩欧美激情| 亚洲女人天堂av| 久久久久97国产| 麻豆成人综合网| 久久精品日产第一区二区三区| 黄色片网站在线| 丁香五六月婷婷久久激情| 亚洲无在线观看| 禁果av一区二区三区| 韩国福利视频一区| 国产美女免费看| 国产精品视频一二| 欧美视频免费播放| 狼人精品一区二区三区在线| 久久国产精品网站| 亚洲一级黄色大片| 国产片一区二区| 麻豆精品视频| 国产网红女主播精品视频| 欧美理论片在线| 9.1片黄在线观看| 视频一区欧美精品| 久久伦理网站| 天堂网在线最新版www中文网| 日韩一区二区免费电影| 四虎影视1304t| 日本欧美韩国一区三区| 欧美精品亚洲精品| 日韩av大片站长工具| 日韩电影免费观看在线观看| 久久免费精彩视频| 国产不卡在线播放| av日韩在线看| 综合激情五月婷婷| 精品少妇v888av| 精品欧美一区二区精品少妇| 一区二区三区影院| 国产精九九网站漫画| 欧美日韩国产探花| 国产精成人品localhost| 羞羞视频在线免费国产| 精品国精品国产尤物美女| 加勒比av在线播放| 成人妖精视频yjsp地址| 每日在线观看av| 日韩美女精品| 国产成人福利网站| avtt亚洲| 欧美一二三区在线| 国产精选第一页| 99精品一区二区三区| 黄色片一级视频| 欧美中文一区二区| 成人欧美在线视频| 污污在线观看| 日韩成人在线观看| 无码免费一区二区三区| 国产精品久久三| 黄色片子免费看| 精品动漫3d一区二区三区免费版 | zjzjzjzjzj亚洲女人| 日韩视频三区| 日本一区二区三区www| 天堂久久一区| 国产69精品99久久久久久宅男| 亚洲欧洲成人在线| 欧美三级中文字幕在线观看| 精品国产欧美日韩不卡在线观看| 丁香激情综合五月| 国产精品69页| 在线国产一区| 精品一卡二卡三卡四卡日本乱码| 第四色男人最爱上成人网| 日韩在线观看免费| 日本高清视频免费看| 色av一区二区| 久久久久久久久久久97| 久久久久99精品国产片| 香蕉视频xxx| 99riav1国产精品视频| 婷婷久久青草热一区二区| 日韩精品一区二区三区中文 | 97人妻一区二区精品免费视频 | 国产美女www| 亚洲激情图片一区| 中日韩精品一区二区三区| 精品一区二区三区视频在线观看| 国产真人做爰毛片视频直播| 不卡在线一区| 久久99精品国产一区二区三区| 成人在线观看免费视频| 97国产suv精品一区二区62| 在线视频91p| 日韩av一区在线| 国产美女免费看| 91国内精品野花午夜精品| 久草资源在线视频| 亚洲欧洲日韩av| 97伦伦午夜电影理伦片| 丁香六月久久综合狠狠色| 久久人人爽av| 久久福利影视| 波多野结衣之无限发射| 亚洲激情中文| 亚洲欧洲另类精品久久综合| 色天下一区二区三区| 99在线热播| 成人国产精品久久| 国产成人精品一区二区| free性欧美16hd| 久久av在线播放| 免费的黄网站在线观看| 一本久久综合亚洲鲁鲁| 嫩草研究院在线观看| 亚洲第一区在线| 韩国中文字幕hd久久精品| 91精品午夜视频| 国产一区二区在线视频聊天| 欧美专区日韩专区| 久久艹免费视频| 亚洲18色成人| 日韩欧美亚洲国产| 成人三级在线视频| 国产女同无遮挡互慰高潮91| 麻豆成人在线观看| www.超碰97.com| 久久国产精品第一页| 欧美一级特黄a| 免费成人在线网站| 五月天av在线播放| 奇米一区二区三区| 亚洲免费av一区二区三区| 天堂va蜜桃一区二区三区 | 亚洲片av在线| 飘雪影视在线观看免费观看| 日韩av在线免费播放| 同心难改在线观看| 亚洲女成人图区| 成人午夜电影在线观看| 一区二区三区无码高清视频| 国产乱子伦三级在线播放| 尤物精品国产第一福利三区| yourporn在线观看中文站| 最近中文字幕日韩精品 | 欧美 日韩 国产精品免费观看| 亚洲午夜高清视频| 亚洲国产成人精品女人| 国产在线观看欧美| 亚洲精品专区| 国产l精品国产亚洲区久久| 久久国产精品亚洲77777| 玩弄japan白嫩少妇hd| 日韩电影免费在线看| 香蕉视频999| 国产成人av一区| 极品粉嫩小仙女高潮喷水久久| 91视频一区二区| 懂色av粉嫩av浪潮av| 亚洲黄色尤物视频| 圆产精品久久久久久久久久久| 欧美性xxxx| 国产一区二区三区四区视频| 精品日韩99亚洲| 三级在线观看| xxxxx成人.com| www.综合| 国产欧美精品在线播放| 欧美日本三级| 免费电影一区| 亚洲成人三区| 成人免费观看视频在线观看| 秋霞国产午夜精品免费视频| 国产精品久久久久久久99| 97精品久久久午夜一区二区三区| 调教驯服丰满美艳麻麻在线视频 | 中文字幕视频一区二区在线有码| av在线看片| 欧美一区二区三区精品电影| 日韩综合av| 国产视频一区二区不卡| 国模吧精品视频| 4444亚洲人成无码网在线观看| 久久高清免费观看| 人妻激情偷乱视频一区二区三区| 91在线porny国产在线看| 亚洲 欧美 国产 另类| 五月天网站亚洲| 一区二区三区精彩视频| 亚洲激情视频网站| 日本www在线观看| 欧美一级片在线播放| 欧美一区在线观看视频| 欧美日韩中文国产一区发布| 亚洲欧美综合| 一区二区xxx| 91色综合久久久久婷婷| 男女羞羞免费视频| 91久久一区二区| 全国男人的天堂网| 久久av中文字幕| 国产三级一区| 美女被啪啪一区二区| 欧美日韩亚洲一区| 成人日韩在线视频| 国产人妖乱国产精品人妖| 国产一级aa大片毛片| 欧美日韩www| 国产尤物视频在线| 26uuu亚洲伊人春色| jizz性欧美23| av磁力番号网| 精品影院一区二区久久久| 国产三级av在线播放| 午夜精品影院在线观看| 成人h动漫精品一区二区无码 | 亚洲承认视频| 狠狠色综合色区| 亚洲网站在线| 任你躁av一区二区三区| 亚洲女女做受ⅹxx高潮| 97超视频在线观看| 少妇高潮久久77777| 嫩草伊人久久精品少妇av杨幂| 欧美日韩国产三区| 欧美中文日韩| 免费看污片网站| 欧美性xxxx18| 精华区一区二区三区| 浅井舞香一区二区| 亚洲高清极品| 国产精品沙发午睡系列| 99re免费视频精品全部| 国产精品黄色大片| 亚洲免费中文字幕| 日韩毛片免费观看| 日韩女优中文字幕| 日韩精品午夜视频| 中文字幕欧美激情极品| 欧美日韩电影一区| 午夜视频在线免费观看| 成人啪啪免费看| 欧美日韩国产亚洲一区| 欧美做受高潮中文字幕| 午夜伦理一区二区| 你懂的视频在线观看| 国产精品久久久精品| 天天av综合| 在线播放国产视频| 亚洲一区二区三区国产| 亚洲 小说区 图片区 都市| 69视频在线免费观看| 蜜桃精品wwwmitaows| 美女一区二区三区视频| 国产精品理伦片| 999国产精品视频免费| 久久久久久97| 亚洲精品国产动漫| 午夜免费高清视频| 亚洲欧美aⅴ...| 爽爽视频在线观看| 国产日韩欧美在线观看| 欧美日韩国产精品一区二区亚洲| 免费的av网站| 欧美日韩亚洲综合| 肉肉视频在线观看| 欧美日韩亚洲免费| 久久se精品一区二区| 国产精品二区一区二区aⅴ| 亚洲欧美一区二区三区四区| 日日夜夜一区| ww国产内射精品后入国产| 欧美高清一级片在线观看| www.国产视频| 国产成人精品视频在线观看| 欧美在线亚洲| 欧美 日韩 国产 成人 在线观看 | 亚洲一区二区图片| 欧美性猛交xxxx乱大交| 国产在线更新| 欧美久久久久久一卡四| 国产一区二区91| 成年人av网站| 欧美国产精品va在线观看| 国产欧美日韩精品一区二区免费 | 欧美高清成人| 亚洲japanese制服美女| 男女精品网站| 国产真人真事毛片| 神马久久久久久| 日韩欧美天堂|