- 写法一:简洁易懂
const asyncPool = async (poolLimit, array, iteratorFn) => {
const resultList = []
const executing = []
for (const item of array) {
const p = Promise.resolve().then(() => {
return iteratorFn(item, array)
})
resultList.push(p)
if (poolLimit <= array.length) {
const e = p.then(() => {
return executing.splice(excuting.indexOf(e), 1)
})
executing.push(e)
if (executing.length >= poolLimit){
await Promise.race(executing)
}
}
}
return Promise.all(resultList)
}
const timeout = (i) => new Promise((resolve) => {
setTimeout(resolve, i, i)
})
const main = async () => {
const aa = await asyncPool(3, [10,20,30,40,50,60,70,80,90], timeout)
}
main()
- 写法二
let urls = ['url1', 'url2', 'url3', ... , 'url20']
function getData(url){
}
function limitLoad(urls, handler, limit) {
let copyUrls = [].concat(urls)
let promises = copyUrls.splice(0, limit).map((url, index) => {
return handler(url).then(() => {
return index
})
})
function getTotalFunc(pCollect, url) {
return pCollect.then(() => {
return Promise.race(promises)
}).then((fastestIndex) => {
promises[fastestIndex] = handler(url).then(() => {
return fastestIndex
})
}).catch((err, url) => {
console.log(err, url)
})
}
reyurn copyUrls.reduce(getTotalFunc, Promise.resove()).then(() => {
Promise.all(promises)
})
}
limitLoad(urls, getData, 3).then((res) => {
console.log('完成!')
})