面试一脸懵: 任务队列懒加载

/**

  • 有一组 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)//运行结果如下图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37285193/article/details/121704511
今日推荐