Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 11x 11x 11x 11x 16x 16x 16x 11x 32x 16x 16x 16x 16x 16x 11x 16x 16x 11x | export interface AsyncLimitOptions {
/**
* 并行量。
*
* @default 1
*/
concurrency?: number
}
/**
* 异步函数并行执行限制。
*
* @param asyncFn 异步函数
* @param options 选项
*/
export function asyncLimit<T extends (...args: any[]) => Promise<any>>(
asyncFn: T,
options: AsyncLimitOptions = {},
): T {
const { concurrency = 1 } = options
const queue: Array<[args: any[], resolve: (res: any) => any]> = []
let activeCount = 0
const call = (...args: any[]) => {
return new Promise(resolve => {
queue.push([args, resolve])
run()
})
}
const run = () => {
if (activeCount < concurrency && queue.length) {
activeCount++
const [args, resolve] = queue.shift()!
const res = asyncFn(...args)
resolve(res)
res.then(next, next)
}
}
const next = () => {
activeCount--
run()
}
return call as any
}
|