精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一本久道中文无码字幕av| 中文字幕一区二区三区在线播放| 国产专区综合网| 欧美亚洲国产怡红院影院| 性色av香蕉一区二区| 牛夜精品久久久久久久| 国产农村妇女毛片精品久久| 亚洲国产视频二区| 国产精品乡下勾搭老头1| 精品国产免费视频| 狠狠久久综合婷婷不卡| 亚洲精品永久www嫩草| 少妇一级淫免费观看| 毛片免费在线播放| 亚洲高清资源在线观看| 亚洲第一av色| 久久精品日韩精品| 国产探花视频在线| 欧美人xxx| 性8sex亚洲区入口| 在线综合+亚洲+欧美中文字幕| 粉嫩av一区二区三区免费观看 | 亚洲精品久久久久久久久久久| 欧美成ee人免费视频| 国内毛片毛片毛片毛片毛片| 国精一区二区三区| 国产精品88av| 日韩一区二区三区国产| 国产精品久久中文字幕| 国产精品美女一区| 欧美精品导航| 在线一区二区三区四区五区 | 久热成人在线视频| 国产婷婷色综合av蜜臀av| 精品一区二区三区无码视频| 伊人久久中文字幕| 国产a久久精品一区二区三区| 欧美欧美欧美欧美首页| 日韩欧美视频一区二区三区四区| 久久亚洲AV无码| 欧美一级做一级爱a做片性| 久久综合久久综合久久综合| 色综合久久88| 一色道久久88加勒比一| 麻豆理论在线观看| 国产成人精品亚洲777人妖 | 免费的黄网站在线观看| 91在线精品秘密一区二区| 久久97精品久久久久久久不卡| 一区二区三区四区免费| 丁香六月综合| 日本一区二区三区高清不卡| 国内精品久久影院| 日韩精品xxx| 国产高清一区二区三区视频 | 樱花视频在线免费观看| 亚洲精选91| 欧美激情精品久久久久久| 日韩av毛片在线观看| 欧美绝顶高潮抽搐喷水合集| 亚洲精品自拍动漫在线| 91在线免费观看网站| 女教师淫辱の教室蜜臀av软件| 你懂的在线观看一区二区| 欧美xxxxxxxx| 超碰中文字幕在线观看| 成人福利片网站| 中文字幕一区二区视频| 亚洲免费视频一区| 91官网在线| 精品亚洲免费视频| 久久久人成影片一区二区三区| 极品色av影院| 欧美第一精品| 久久精品亚洲国产| 熟妇无码乱子成人精品| 伊人久久大香线蕉综合影院首页| 色综合久久久久综合体桃花网| 日韩精品一区二区三区丰满 | 中文字幕日韩在线观看| 800av在线播放| 另类尿喷潮videofree| 日韩欧美在线视频日韩欧美在线视频| 久久涩涩网站| 欧洲亚洲在线| 国产亚洲视频系列| 国产精品电影网| 国语对白在线播放| 蜜桃一区二区三区| 国产一区二区动漫| 午夜免费视频网站| 视频成人永久免费视频| 欧美zozozo| 九色porny自拍视频| 国产精品午夜一区二区三区| 伊人亚洲福利一区二区三区| 古装做爰无遮挡三级聊斋艳谭| 精品视频在线观看免费观看| 精品国产三级电影在线观看| 亚洲中文字幕无码av| 亚洲一区站长工具| 欧美吻胸吃奶大尺度电影| 久热精品在线播放| 涩涩视频在线| 在线观看成人免费视频| 五月天国产视频| 另类春色校园亚洲| 中文字幕精品网| 欧美丰满艳妇bbwbbw| 亚洲中字在线| 成人在线一区二区| 婷婷丁香花五月天| 久久精品女人| 26uuu另类亚洲欧美日本一| 免费黄色av片| 亚洲高清久久| 久久夜精品香蕉| 国产毛片欧美毛片久久久| 国产精品自在线拍| 中文字幕亚洲天堂| 天堂资源在线播放| 男女性色大片免费观看一区二区| 久久久视频在线| 天堂网免费视频| 国产成人综合网站| 亚洲成色www久久网站| 免费毛片在线看片免费丝瓜视频| 国产精品嫩草久久久久| 欧美亚洲黄色片| 成人黄色网址| 色94色欧美sute亚洲线路一ni| 日韩精品在线观看av| 一二区成人影院电影网| 欧美大片拔萝卜| 99久久99久久精品免费| 亚洲激情社区| 97超碰人人看人人| 97电影在线| 亚洲一区二区在线免费观看视频| 欧美日韩精品免费在线观看视频| 暖暖视频在线免费观看| 怡红院av一区二区三区| xxww在线观看| 日韩高清在线| 亚洲第一精品夜夜躁人人躁| 天天综合成人网| 综合色就爱涩涩涩综合婷婷| 亚洲欧洲在线视频| 国产精品成人无码免费| 性欧美xxxx大乳国产app| 国产精品久久久久久久久婷婷 | 欧美亚洲在线日韩| 奇米一区二区三区四区久久| 国产亚洲欧美在线精品| 成人丝袜高跟foot| 精品视频一区二区| 欧美aaaaaaa| 日韩一区二区三区四区五区六区| 18啪啪污污免费网站| 日日夜夜一区二区| 国产成人综合精品在线| 97免费在线观看视频| 国自产拍偷拍福利精品免费一| 国产成人精品最新| 欧美精品少妇| 日韩欧美一区二区三区| 精品无码在线视频| 亚洲国产三级| 国产精品免费区二区三区观看| 在线观看av免费| 亚洲一级片在线观看| 九色91popny| 色播一区二区| 欧美激情一区二区三区在线视频观看| 日韩av在线天堂| 极品av少妇一区二区| 电影午夜精品一区二区三区| 日韩免费影院| 亚洲精品一区二区三区蜜桃下载 | 亚洲无人区一区| 农村末发育av片一区二区| 欧美日韩第一区| 国产伦精品一区二区三区视频黑人 | 成人资源av| 黄视频免费在线看| 亚洲精品网站在线播放gif| 日本在线播放视频| 久久精品一区二区国产| 欧美一区二区三区电影在线观看 | 亚洲一区二区三区小说| 国产大学生视频| 亚洲欧美久久| 亚洲永久激情精品| 手机av在线| 欧美在线影院一区二区| 麻豆网址在线观看| 成人毛片老司机大片| 97xxxxx| 欧美电影《睫毛膏》| 丁香婷婷久久久综合精品国产| 美女91在线看| 在线午夜精品自拍| 99久久精品国产一区二区成人| 亚洲国产日产av| 久久久久久久久久久久久久久| 麻豆精品精品国产自在97香蕉| 成人一区二区av| 免费av一区二区三区四区| 国产欧美一区二区三区在线| 最新黄网在线观看| 亚洲毛片在线看| 国产精品久久久久久久久久久久久久久久久久 | 国产精品国产三级国产普通话蜜臀 | 日韩视频精品在线观看| 日韩av在线电影观看| 99热这里有精品| 奇米四色中文综合久久| 综合图区亚洲| 国产亚洲日本欧美韩国| 亚洲AV无码精品国产| 在线一区二区视频| 国产一级性生活| 亚洲色图在线看| 色婷婷av777| 丁香婷婷综合激情五月色| 天天操,天天操| 亚洲精品日韩久久| 亚洲图片欧洲图片日韩av| 国产精品丝袜在线播放| 国产精品1234| 成入视频在线观看| 久久亚洲精品国产亚洲老地址| 涩爱av在线播放一区二区| 日韩一级视频免费观看在线| 黄色片视频免费| 五月天视频一区| 精品99在线观看| 国产精品国产成人国产三级| 色噜噜在线观看| 成人av午夜电影| 永久免费看片在线观看| 麻豆视频观看网址久久| 日韩中文字幕免费在线| 99视频精品免费观看| 高清无码一区二区在线观看吞精| 久久福利综合| 亚洲精品中文字幕在线| 国产麻豆精品久久| 蜜桃狠狠色伊人亚洲综合网站| 久久天堂久久| 亚洲最大av网| 男人资源在线播放| 亚洲性线免费观看视频成熟| 懂色av成人一区二区三区| 一区二区三区在线观看动漫| 国产精品免费在线视频| 久久精品视频一区二区三区| 玖玖爱在线精品视频| 国产成人自拍高清视频在线免费播放| 在线免费观看av网| 国产精品一区专区| 亚洲国产日韩在线一区| 国产美女视频91| 免费不卡av网站| 国产精品一区二区免费不卡 | 日韩免费一区二区| 国产小视频一区| 精品美女在线播放| 日本激情视频网站| 337p日本欧洲亚洲大胆色噜噜| 黄频在线免费观看| 亚洲国产另类 国产精品国产免费| 空姐吹箫视频大全| 日韩av在线网| 日本国产在线观看| 亚洲国产精品yw在线观看| 亚洲国产精品18久久久久久| 日韩一区二区三区在线视频| 韩国av免费在线| 亚洲欧美日韩中文在线| 国产毛片av在线| 最新亚洲国产精品| 91麻豆免费在线视频| 久久久天堂国产精品女人| 男人av在线播放| 国产精品91久久久久久| 国产人妖一区| 99r国产精品视频| 久久成人福利| 秋霞毛片久久久久久久久| www亚洲色图| 亚洲欧美自偷自拍| 韩国精品视频| 任我爽精品视频在线播放| 91欧美日韩一区| 国产情侣一区在线| 国产精品初高中精品久久| 日韩精品丝袜美腿| 国产精品第10页| 国产成+人+综合+亚洲欧美| 成人18视频| 日韩欧美一区二区三区在线视频| 免费一区二区三区在在线视频| 日韩在线综合| 日韩精品视频在线观看视频| av网站免费播放| 精品久久五月天| 成人免费一区二区三区视频网站| 欧美裸体xxxx极品少妇| 天堂资源在线| 成人免费高清完整版在线观看| 国产伦理久久久久久妇女| 日韩精品久久久| 国产精品v日韩精品v欧美精品网站| 午夜精品久久久久久久无码| 久久99精品国产麻豆不卡| 最近日本中文字幕| 亚洲视频免费在线| 亚洲天堂一区在线| 91精品国产色综合久久| 四虎影视精品成人| 另类视频在线观看| 伊人久久综合一区二区| 91视频免费在线观看| 欧美在线观看视频一区| 可以看毛片的网址| 久久精品国产**网站演员| 性囗交免费视频观看| 亚洲综合色网站| 国产伦子伦对白视频| 日韩专区在线播放| 肉肉视频在线观看| 999精品视频一区二区三区| 成人同人动漫免费观看| 日日橹狠狠爱欧美超碰| 国产成人在线视频网站| 欧美性生交大片| 91成人看片片| 少妇高潮喷水久久久久久久久久| 免费日韩一区二区| 日本少妇xxxx| 一区二区在线电影| 亚洲天堂aaa| 一区二区欧美激情| 日韩成人亚洲| 日本高清不卡三区| 男人的天堂成人在线| 精品国产一区在线| 亚洲成人午夜影院| www.蜜臀av.com| 欧美老女人性视频| **日韩最新| 影音先锋欧美在线| 99国产**精品****| 免费观看成人网| 久久久久久9999| 国产又粗又爽视频| 亚洲欧美制服第一页| 亚洲福利影院| 欧美精品在线一区| 久久精品国产清高在天天线| 国产精品815.cc红桃| 色偷偷久久一区二区三区| 青青国产在线| 日本精品视频在线播放| 亚洲动漫精品| 国产成人精品一区二区| 国产黄色的视频| 国产成人免费xxxxxxxx| 秋霞欧美一区二区三区视频免费| 久久婷婷激情| 国产精品久久久久久久久久ktv | 亚洲欧洲自拍| 欧美日韩免费观看一区| 天堂久久久久va久久久久| 男人舔女人下部高潮全视频| 色婷婷精品久久二区二区蜜臀av| 嫩草在线播放| 国产精品v片在线观看不卡| 日本精品三区| 国产精品久久久久久久99| 亚洲精品高清在线观看| 欧美 日韩 人妻 高清 中文| 欧美一级免费视频| 国产探花一区在线观看| 日本人69视频| 亚洲激情图片qvod| 日日夜夜精品免费| 国产精品xxxxx| 国产精品久久久久久麻豆一区软件| 日本55丰满熟妇厨房伦| 亚洲成人一区二区在线观看| 精品av中文字幕在线毛片| 国产又爽又黄的激情精品视频| 在线看片一区| 欧美肥妇bbwbbw| 亚洲欧美精品一区| 欧美久久亚洲| 免费看污污网站| 亚洲成人自拍一区|