成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

幾百個數據,Promise.all 沒做控制并發?那你心可真大??!

開發 前端
隨后大佬們提出解決方案:控制并發,大佬們是真的強,感覺這種東西已經是大佬們的常規操作了。

需求

我最近在做一個需求:批量去往數據庫里存儲一些東西,數量可能一次性達到幾百個,也就意味著我需要一次性往數據庫里存儲幾百次,我是這么做的:

const save = (data) => {
// 數據庫操作(Promise)
return insert(data)
}
const datas = [...幾百個數據]
// 進行存儲
Promise.all(datas.map(save))

被呵斥

正當我覺得這個需求很輕松的時候。。在 Code Review 上,我被團隊的大佬們給呵斥了一頓,理由是:存儲的操作發生在服務器,服務器是很脆弱的,你一次性存儲幾百個,服務器崩了怎么辦?

隨后大佬們提出解決方案:控制并發,大佬們是真的強,感覺這種東西已經是大佬們的常規操作了。。

控制Promise.all并發

意思就是,比如我有幾百個存儲操作,我不能一次性去全部執行,而是要控制一次性只能執行10個操作,10個中有一個執行完了,就拿還沒執行的操作補上去,就這樣一直到這幾百個操作全部執行完為止。。

其實很簡單,可以直接用庫,比如async-pool、es6-promise-pool、p-limit,只要是能用庫的,我建議不要自己去寫,因為不定因素很多,你自己寫的肯定沒有庫寫的好,你說呢~

簡單實現

看到一位兄弟實現的挺不錯的,鏈接:https://segmentfault.com/a/1190000016389127

這是async-pool這個庫的核心源碼:

function asyncPool(poolLimit, array, iteratorFn) {
let i = 0;
const ret = [];
const executing = [];
const enqueue = function () {
// 邊界處理,array為空數組
if (i === array.length) {
return Promise.resolve();
}
// 每調一次enqueue,初始化一個promise
const item = array[i++];
const p = Promise.resolve().then(() => iteratorFn(item, array));
// 放入promises數組
ret.push(p);
// promise執行完畢,從executing數組中刪除
const e = p.then(() => executing.splice(executing.indexOf(e), 1));
// 插入executing數字,表示正在執行的promise
executing.push(e);
// 使用Promise.rece,每當executing數組中promise數量低于poolLimit,就實例化新的promise并執行
let r = Promise.resolve();
if (executing.length >= poolLimit) {
r = Promise.race(executing);
}
// 遞歸,直到遍歷完array
return r.then(() => enqueue());
};
return enqueue().then(() => Promise.all(ret));
}

大概的邏輯可以總結為:

  • 從array第1個元素開始,初始化promise對象,同時用一個executing數組保存正在執行的promise
  • 不斷初始化promise,直到達到poolLimt
  • 使用Promise.race,獲得executing中promise的執行情況,當有一個promise執行完畢,繼續初始化promise并放入executing中
  • 所有promise都執行完了,調用Promise.all返回

使用方式:

const timeout = i => new Promise(resolve => setTimeout(() => resolve(i), i));
return asyncPool(2, [1000, 5000, 3000, 2000], timeout).then(results => {
...
});
責任編輯:龐桂玉 來源: 前端大全
相關推薦

2025-05-08 08:35:00

異步編程JavaScriptAPI

2021-08-16 10:40:36

數據庫耦合

2023-12-14 08:41:29

El-selectNodevue2

2023-10-04 07:25:59

JavaScriptpromises

2024-06-03 00:00:01

2020-08-03 10:52:35

Python自動化工具

2024-08-26 08:47:32

2025-03-07 07:20:00

JavaScript異步編程Promise

2019-03-04 08:32:01

DBA數據庫JDBC

2011-05-24 09:47:07

Cisco思科網絡管理

2021-01-12 13:29:20

數據神經網絡

2013-04-27 16:44:54

大數據大數據全球技術峰會

2013-07-23 16:43:28

Android開源項目

2022-06-02 14:00:41

網絡攻擊黑客勒索攻擊

2012-02-01 10:13:04

2015-06-11 16:22:51

數據中心

2010-03-10 17:15:02

核心交換機

2024-03-29 10:10:16

異常Promise

2010-04-16 16:49:00

WPS Office
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费淫片aa视频免费 | 中国一级大毛片 | 国产一区二区在线免费观看 | 粉嫩一区二区三区四区公司1 | 国产综合第一页 | 老司机久久 | 亚洲视频免费观看 | 精品精品视频 | 国产精品久久久久久久久 | 久久综合一区二区三区 | 日韩av成人在线 | 婷婷综合色 | av一级在线观看 | 国产一区日韩在线 | 国产羞羞视频在线观看 | 精品国产欧美一区二区 | 一级毛片在线播放 | 91精品一区二区三区久久久久久 | 精品国产乱码久久久久久闺蜜 | 日韩在线观看一区 | 久久精品伊人 | 亚洲精品乱 | 久久久精品网站 | 欧美二区在线 | 欧美精品中文字幕久久二区 | 视频一二区 | 中文字幕在线观看一区二区 | 国产欧美日韩一区二区三区在线观看 | 中文字幕在线观看视频网站 | 国内久久 | 国产欧美精品一区二区 | 羞羞视频在线网站观看 | 91免费在线看 | 国产精品96久久久久久 | 国产成人精品在线播放 | 国产精品久久久久久久免费大片 | 日韩中文字幕在线视频观看 | 成人动慢| 精品99久久久久久 | 亚洲精品v日韩精品 | 91精品国产乱码久久久久久久 |