UNPKG

@mrli-utils/asyncpool

Version:

异步请求并发控制函数,限制同一时间发起的请求量

99 lines (70 loc) 2.56 kB
# @mrli-utils/asyncpool 适用于浏览器、Nodejs 的javascript 的并发控制函数 ## 1. Installation ```bash # npm npm install @mrli-utils/asyncpool --save # yarn yarn add @mrli-utils/asyncpool # pnpm pnpm install @mrli-utils/asyncpool ``` ## Attribute asyncPool(limit, paramsArray, serviceFn, [useAllSettled]) asyncPool函数接收四个参数 `limit` - 类型:Number - 描述:同一时间发请求的最大数量 `paramsArray` - 类型:any[][]: 二维数组, - 描述:若serviceFn接受n个参数, 那么内层的每一个数组都应该有n项元素,n项元素将依次作为serviceFn函数入参的每一项 `serviceFn` - 类型:Function - 描述:真正的异步请求函数 **若请求函数内部需要绑定this, 需要用bind进行绑定后再传入** `useAllSettled`(可选) - 类型:Boolean - 描述:asyncPool内部默认使用 `Promise.all`处理批量请求, 若`useAllSettled`为`true`, 则内部使用`Promise.allSettled`处理异步请求,**注意: useAllSettled为true时候, 即使serviceFn函数抛出异常, 也不会终止整个asyncPool,直到所有参数都由servicerFn处理完成后才会有最终的返回结果** ## 3. Usage ### 按需引入 ```js /* Nodejs */ const { asyncPool } = require("@mrli-utils/asyncpool"); /* 浏览器 */ import { asyncPool } from '@mrli-utils/asyncpool' ``` ### 使用示例 ```js // 真是的请求函数 function getPageList(filter, page) { return axios.get('/xxxxx',{ method:'GET', params:{ filter, page } }) } // 每次请求的参数, 有个数组元素就会发出几次请求, 这里是5次 let paramsArray = [ [{name:'xxx'}, {pageSize:100, pageNum: 1}], [{name:'xxx'}, {pageSize:100, pageNum: 2}], [{name:'xxx'}, {pageSize:100, pageNum: 3}], [{name:'xxx'}, {pageSize:100, pageNum: 4}], [{name:'xxx'}, {pageSize:100, pageNum: 5}] ]; // 若请求函数内部需要绑定this, 需要用bind进行绑定后使用 const serviceName = getPageList.bind(this) // 伪代码 // 请求示例, 2表示同一时间内最多2个请求 asyncPool(2, paramsArray, serviceName) .then(result => { console.log("请求结果数组", result); // result是每个请求返回的结果 const data = []; // 最终的结果 result.forEach(res=>{ // 将请求结果取出来放到同一个数组内 data.push(res.xxxxx) }) // ... 对请求结果的后续操作 }) .catch(e => { // 只要paramsArray.length个请求中有一个出错了, 就会进入catch console.log("出错了", e); }); ```