function asyncRequest (requestList, limits, callback) {
const promiseList = requestList.slice()
const countLimit = Math.min(limits, promiseList.length)
let currentCount = 0
const runTaskStart = () => {
let i = 0
while (i < countLimit) {
i++
runTask()
}
}
const runTask = () => {
const promise = promiseList.shift()
promise && runer(promise)
}
const runer = async (promise) => {
try {
currentCount++
await promise()
} catch (error) {
callback && callback(error)
} finally {
currentCount--
picker()
}
}
const picker = () => {
if (promiseList.length && currentCount < countLimit) {
runTask()
} else if (!promiseList.length && currentCount === 0) {
callback && callback('sss')
}
}
runTaskStart()
}
const list = [
() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('请求1');
resolve()
}, 1000)
})
},
() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('请求2');
resolve()
}, 1000)
})
},
() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('请求3');
resolve()
}, 1000)
})
},
() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('请求4');
resolve()
}, 1000)
})
},
() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('请求5');
resolve()
}, 1000)
})
}]
asyncRequest(list, 2, (res) => {
console.log('请求完成', res)
})