听说这个题很火我也来试试 关键点在于promise.all的then继续调用run函数。思想有点类似于co模块
function limitRequest(urlLists,limit){
// 记录已经发送的数量
let hasSend = 0
// 结果集
let resultList = []
/**
* 获取请求或者是promise对象
* @returns 返回一个数组
*/
const getSlice = function(){
let urls = urlLists.slice(hasSend,hasSend + limit)
hasSend = hasSend + limit
let reqs = urls.map(url=>new Promise((resolve,reject)=>{resolve(hasSend)}))
return reqs
}
const run = function(reslove,reject){
Promise.all(getSlice()).then(res=>{
resultList = resultList.concat(res)
if(hasSend >= urlLists.length){
// 如果结果数量够了,就返回
reslove(resultList)
}else{
// 继续调用自身
run(reslove,reject)
}
}).catch(err=>reject(err))
}
// 必须返回一个promise
return new Promise((reslove,reject)=>{
run(reslove,reject)
}
)
}
let url = ["1","2","3","4"]
limitRequest(url,3).then(res=>{
console.log("res是",res)
})