【JS】并發控制

需求

  • 控制網絡請求并發數
  • 控制并發按順序返回結果


/**
* 控制并發
* @param {Function} fn 邏輯處理函數
* @param {Array} arr 發送的數據
* @param {Number} [max=3] 并發數 默認3
* @param {Number} [order=false] 按順序返回執行結果 默認false
* @param {Number} [retry=1] 重試次數 默認1
* @returns {Promise} 返回Promise
*/
const reqPool = (fn, arr, max = 3, order = false, retry = 1) => {let reqList        = [...arr],                                        //不改變arrresData        = order ? Array(reqList.length).fill(0, 0) : [],   //  order = true 填充返回的數據curRuningCount = 0,                                               //限制內的第n個并發 runedCount     = 0,                                               //已執行的數量                         runingIndex    = 0;                                               //當前執行下標                       return new Promise(res => {const run = _ => {while (curRuningCount < max && reqList.length) {curRuningCount++const chunk = reqList.shift();(i => {/*** 當前重試次數 */let _retry = 0const add = (i2, data) => fn(data).then(r => {runedCount++order ? resData[i2] = r : resData.push(r)}).catch(err => {_retry++const repMore = _retry > retryif (!repMore) {add(i2, data)console.log(data, '重試' + _retry + '次');} else {order ? resData[i2] = err : resData.push(err)runedCount++}}).finally(_ => {curRuningCount--if (runedCount === arr.length) res(resData)run()});add(i, chunk)})(runingIndex++)}}run()})
}// 請求配置 | 請求體
const chunks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];/**
* 邏輯處理函數 | 如:發起請求
* @param {Object} chunk
* @returns {Promise} 
*/
const req = chunk => new Promise((res, rej) => setTimeout(_ => Math.random() > .8 ? rej('失敗----' + chunk) : res('結果' + chunk), Math.random() * 100 + 100))reqPool(req, chunks, 3, true).then(res => console.log(res))

運行圖

在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19385.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue項目集成螢石云在Web系統中實現實時攝像頭監控及控制功能

需求 需求&#xff1a; 開發人員在產線上放置一個螢石攝像頭&#xff0c;前端在可視化大屏上實時監控&#xff0c;且控制左右上下功能。 效果 螢石云接入web前期準備工作 閱讀螢石云API文檔&#xff1a;螢石云開放平臺開發者文檔 閱讀螢石云控制API文檔&#xff1a;螢石云攝…

【錯題集-編程題】dd 愛旋轉(模擬)

牛客對應題目鏈接&#xff1a;dd愛旋轉 (nowcoder.com) 一、分析題目 模擬題&#xff0c;但是需要不能直接無腦模擬&#xff0c;要思考?下規律。 順時針旋轉 180&#xff1a;行變換 列變換行變換、列變換的順序顛倒不會有影響行變換的次數是個數相當于不變 二、代碼 #includ…

設計模式--》 裝飾模式的應用

裝飾模式的定義&#xff1a; 裝飾模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許你動態地給一個對象添加一些額外的職責。就增加功能來說&#xff0c;裝飾模式相比生成子類更為靈活。 何時應用裝飾模式&#xff1f; 1.當需要動態地給…

《C語言深度解剖》(15):動態內存管理和柔性數組

&#x1f921;博客主頁&#xff1a;醉竺 &#x1f970;本文專欄&#xff1a;《C語言深度解剖》 &#x1f63b;歡迎關注&#xff1a;感謝大家的點贊評論關注&#xff0c;祝您學有所成&#xff01; ??&#x1f49c;&#x1f49b;想要學習更多C語言深度解剖點擊專欄鏈接查看&…

k8s中的集群調度

文章目錄 k8s中的集群調度Pod 創建流程 通過指定節點來創建pod所在的node節點通過標簽來指定pod創建在哪個節點上pod 的親和性Pod的親和性和反親和性親和性&#xff08;Affinity&#xff09;反親和性&#xff08;Anti-Affinity&#xff09; 污點與容忍污點&#xff08;Taint&am…

Spring Cache入門詳解

一、概述 1.1緩存介紹 Spring提供了一套cache緩存抽象(注解/接口)&#xff0c;使基于spring緩存的使用與實現解耦 默認實現&#xff0c;Spring JDK ConcurrentMap-based Cache第三方實現&#xff0c;caffeine/Ehcache/Redis等 https://docs.spring.io/spring-framework/do…

Postman快捷功能-快速填寫請求頭

大家好&#xff0c;之前給大家分享關于 Postman 工具的基礎使用&#xff0c;今天給大家介紹一個快捷功能&#xff0c;可以一定程度提高我們使用 Postman 工具的效率&#xff0c;在我們進行接口測試時&#xff0c;幾乎每個接口都需要填寫 Headers&#xff0c;且 Headers 中的參數…

【ai】livekit服務本地開發模式2:模擬1個發布者

是一個會議用軟件:LiveKit is an open source project that provides scalable, multi-user conferencing based on WebRTC. It’s designed to provide everything you need to build real-time video audio data capabilities in your applications.LiveKit’s server is wr…

【Python】 Django 框架如何支持百萬級日訪問量

基本原理 Django 是一個高級的 Python Web 框架&#xff0c;它鼓勵快速開發和干凈、實用的設計。Django 遵循 MVC&#xff08;模型-視圖-控制器&#xff09;設計模式&#xff0c;允許開發者通過編寫更少的代碼來構建高質量的 Web 應用程序。Django 自帶了許多內置功能&#xf…

發現沒:隨便搞個B端頁面,就想在客戶那里過關,難啦。

客戶對B端界面要求越來越高的原因可以有以下幾點&#xff1a; 用戶體驗要求提升&#xff1a;隨著用戶對移動應用和網頁的使用經驗增加&#xff0c;他們對于界面的交互、流暢性和易用性要求也越來越高。他們希望能夠在使用B端應用時&#xff0c;能夠快速、方便地完成任務&#…

2024年華為OD機試真題-文本統計分析-C++-OD統一考試(C卷D卷)

題目描述: 有一個文件, 包含以一定規則寫作的文本, 請統計文件中包含的文本數量 規則如下 1. 文本以";"分隔,最后一條可以沒有";",但空文本不能算語句,比如"COMMAND A; ;"只能算一條語句. 注意, 無字符/空白字符/制表符都算作"空&qu…

設計模式詳解(六):適配器模式——Adapter

目錄導航 適配器模式及其作用現實生活舉例 適配器模式的好處適配器模式的實現關系圖實現步驟 適配器模式的適用場景適配器模式示例 適配器模式及其作用 適配器模式是一種結構型設計模式。所謂結構型是指在代碼結構方面的設計模式。適配器模式作為中間層&#xff0c;可以讓交互…

Vue3 圖片或視頻下載跨域或文件損壞的解決方法

Vue3 圖片或視頻下載跨域或文件損壞的解決方法 修改跨域配置文件下載方法 修改跨域配置文件 修改vite.config.ts文件proxy里面寫跨域地址&#xff0c;如下圖&#xff0c;圖片地址就是我們要跨域的目標地址&#xff1a; 下載方法 如下就是我取消上面那句后的報錯 然后調用兩…

【C++風云錄】C++與智能交通:智能交通系統與車聯網

解鎖C的力量&#xff1a;在智能交通系統與車聯網中使用關鍵庫 前言 本文關注于C在智能交通系統與車聯網中的應用&#xff0c;并提供了五個常見庫的簡介和使用方法。這些庫包括&#xff1a;Veins, SUMO-GUI, OMNeT, NS-3和PLEXE&#xff0c;每個庫都有其獨特的功能和優點&…

【Java】Sping Boot中使用Javax Bean Validation

目錄 Javax Bean Validation在Spring Boot中集成Javax Bean Validation使用案例功能測試配置全局異常處理器重新測試返回特定形式的信息方式一方式二 附&#xff1a;常用的注解 Javax Bean Validation Javax Bean Validation是Java平臺的一項規范&#xff0c;旨在提供一種簡單…

想知道股指期貨和期權有什么不同嗎?

市場上目前有中金所的滬深300ETF&#xff0c;中證500和中證1000股指期貨&#xff0c;期權市場有上證50ETF&#xff0c;滬深300etf和中證500ETF期權&#xff0c;股指期貨和期權在買賣雙方的權利義務、風險收益特征、保證金制度、上市合約數量等方面均有較大區別&#xff0c;下文…

每天學點小知識:Windows終端Powershell美化

前言 本章的旨在教會你美化自己的終端&#xff0c;powershell需要以管理員運行 經過我的測試&#xff0c;不同的電腦可能會有不同的報錯&#xff0c;具體操作根據官方為主https://ohmyposh.dev/docs 效果展示 Oh My Posh&#xff1a;提供美觀的 PowerShell 提示符主題 1.安裝…

揭秘CISA:你不知道的信息安全認證,輕松掌握職場先機!

在當今的信息化時代&#xff0c;信息系統的安全和穩定是企業和組織的重要資產。信息系統審計是一項專業的工作&#xff0c;需要具備豐富的知識和經驗&#xff0c;以及敏銳的洞察力和判斷力。信息系統審計師是信息系統審計領域的專業人士&#xff0c;他們負責對信息系統的設計、…

MVVM模式的優點以及與MVC模式的區別?

1.MVVM 模式的優點&#xff1a; 1 、低耦合&#xff1a; 視圖&#xff08; View &#xff09;可以獨?于 Model 變化和修改&#xff0c;?個 ViewModel 可以綁定到不同的 "View" 上&#xff0c;當 View 變化的時候 Model 可以不變&#xff0c;當 Model 變化的時…

【OpenGL實踐12】關于緩存區Framebuffer的運用

文章目錄 一、說明二、幀緩沖區三、創建新的幀緩沖區四、附屬裝飾4.1 紋理圖像4.2 渲染緩沖區對象圖像 五、使用幀緩沖區5.1 后期處理5.2 更改代碼 六、后期處理效果6.1 色彩處理6.2 模糊6.3 Sobel算子 七、結論練習 一、說明 關于FrameBuffer的使用&#xff0c;是OpenGL的高級…