代码片段
⌈工具⌋ 在队列中执行异步函数
根据传入的函数,及参数数组,按队列执行,并可配置最大同时执行个数。
javascript
/**
* 队列执行函数
* @param {Function} asyncFunction 异步函数
* @param {Array} items 数据数组
* @param {Number} maxConcurrent 最大并行
* @returns
*/
export function executeAsyncFunctionInQueue(
asyncFunction,
items,
maxConcurrent = 10
) {
items = items.slice()
return new Promise((resolve) => {
const total = items.length
const results = []
const executing = new Set()
const executeNext = async () => {
if (items.length === 0) {
return
}
const currentIndex = total - items.length
const item = items.shift()
const promise = asyncFunction(item, currentIndex)
.then((result) => {
results.push(result)
})
.catch((error) => {
results.push(error)
})
.finally(() => {
executing.delete(promise)
if (executing.size || items.length) {
executeNext()
} else {
resolve(results)
}
})
executing.add(promise)
}
while (executing.size < maxConcurrent && items.length > 0) {
executeNext()
}
})
}
2024-12-23