前言:使用Typescript编写如下函数功能 并发控制函数 要求控制任务执行的并发上限为concurrency
/*
* @Author: wztlink1013
* @Date: 2022-07-25 19:57:09
* @LastEditTime: 2022-07-25 19:57:22
* @Description:
*/
// Practice 1
const test_1 = () => {
return new Promise(resolve => {
setTimeout(() => {
console.log('2000')
let myDate = new Date()
console.log('---- ', myDate.toTimeString().substring(0, 8), ' ----')
resolve(2000)
}, 2000)
})
}
const test_2 = () => {
return new Promise(resolve => {
setTimeout(() => {
console.log('3000')
let myDate = new Date()
console.log('---- ', myDate.toTimeString().substring(0, 8), ' ----')
resolve(3000)
}, 3000)
})
}
const test_3 = () => {
return new Promise(resolve => {
setTimeout(() => {
console.log('4000')
let myDate = new Date()
console.log('---- ', myDate.toTimeString().substring(0, 8), ' ----')
resolve(4000)
}, 4000)
})
}
let arr = [test_1, test_2, test_3]
async function parallel(
tasks: (() => void)[],
concurrency: number
): Promise<void> {
const ret: any[] = []
const executing: any[] = []
let myDate = new Date()
console.log('----start ', myDate.toTimeString().substring(0, 8), ' ----')
for (const item of tasks) {
const p = Promise.resolve().then(item)
ret.push(p)
if (concurrency <= tasks.length) {
const e: any = p.then(() => executing.splice(executing.indexOf(e), 1))
executing.push(e)
if (executing.length >= concurrency) {
await Promise.race(executing)
}
}
}
// return Promise.all(ret);
}
parallel(arr, 2)
评论区