/**
- 有一组 url 的数组:array = [url1, url2…]
*一个拉取url的fetch方法,返回promise:fetch(url).then(); - 实现execute方法,同时最多只能有 limit 个 fetch 可以同时执行。
*并且下载的尽可能快,在1个fetch 下载完成后就马上开始下一个待下载的url。
*/
function execute(array, limit){
let promises = array.splice(0, limit).map((item, index)=>{
return fetch(url).then(_=>index)
})
let p = Promise.race(promises)
for(let i =0; i < array.length; i++ ){
p = p.then(res=>{
promises[res] = fetch(array[i]).then(_=>res)
return Promise.race(promises)
})
}
}
示例补充
function loadImg(url){
return new Promise(resolve=>{
console.log('----------'+url.name+' start');
setTimeout(()=>{
console.log(url.name+' ok');
resolve()
},url.time)
})
}
function getUrls(urls, limit){
let promies = urls.splice(0, limit).map((item, index)=>{
return loadImg(item).then(_=>index)
})
let p = Promise.race(promies)
for(let i = 0; i < urls.length; i++){
p = p.then(res=>{
promies[res] = loadImg(urls[i]).then(_=>res)
return Promise.race(promies)
})
}
}
let urls = [
{
name:"1.png",time:200},
{
name:"2.png",time:100},
{
name:"3.png",time:400},
{
name:"4.png",time:500},
{
name:"5.png",time:1000},
{
name:"6.png",time:1600},
{
name:"7.png",time:2300},
{
name:"8.png",time:700},
{
name:"9.png",time:100},
{
name:"10.png",time:500},
{
name:"11.png",time:800},
{
name:"12.png",time:500},
{
name:"13.png",time:800},
{
name:"14.png",time:200},
]
getUrls(urls, 2)//运行结果如下图