@mrli-utils/asyncpool
v2.0.0
Published
异步请求并发控制函数,限制同一时间发起的请求量
Downloads
2
Readme
@mrli-utils/asyncpool
适用于浏览器、Nodejs 的javascript 的并发控制函数
1. Installation
# 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
按需引入
/* Nodejs */
const { asyncPool } = require("@mrli-utils/asyncpool");
/* 浏览器 */
import { asyncPool } from '@mrli-utils/asyncpool'
使用示例
// 真是的请求函数
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);
});