@mrli-utils/asyncpool
Version:
异步请求并发控制函数,限制同一时间发起的请求量
99 lines (70 loc) • 2.56 kB
Markdown
适用于浏览器、Nodejs 的javascript 的并发控制函数
```bash
npm install @mrli-utils/asyncpool --save
yarn add @mrli-utils/asyncpool
pnpm install @mrli-utils/asyncpool
```
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处理完成后才会有最终的返回结果**
```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);
});
```