请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

【6-3作业】有最大并发数限制的Promise设计

// Promise加载图片
var loadImg = (url) => {
	return new Promise((resolve, reject) => {
            // 创建图片
            var img = new Image()
            // 加载成功
            img.onload = () => {
            resolve(img)
            }
            // 图片加载
            img.onerror = () => {
            reject(new Error('图片加载失败'))
            }
            img.src = url
            })
            }
            var imgs = ['https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2553992741.webp',
            'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2555538168.webp',
            'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2555538168.webp'
            ]
            // 并行加载
            var loadImgAsync = (imgs)=>{
            imgs.forEach(async (item)=>{
            let img = await loadImg(item)
            document.body.appendChild(img)
	});
}
loadImgAsync(imgs)

如何实现十张十张加载呢

正在回答

2回答

同学你好,可以有很多方式,我花了几分钟随便写了一个,肯定不算最好,但基本能用,可供参考:

function batchLoadImgs(imgs, onAllLoaded, maxSize = 10) {
    const left = imgs.slice();
    let counter = 0;

    function promiseWrap(src) {
        return new Promise((resolve, reject) => {
            const img = new Image();
            img.onload = resolve;
            img.onerror = reject;
            img.src = src;
        });
    }

    function onDone() {
        const top = left.shift();
        if (top) {
            promiseWrap(top).then(onDone);
        }

        if (++counter === imgs.length) {
            onAllLoaded();
        }
    }

    const firstBatch = left.slice(0, Math.min(maxSize, left.length));
    
    left.splice(0, firstBatch.length);
    
    firstBatch.forEach(img => {
        promiseWrap(img).then(onDone);
    });
}

祝您学习愉快!

1 回复 有任何疑惑可以回复我~
  • 非常感谢!
    回复 有任何疑惑可以回复我~ 2019-05-28 08:43:28
  • 请问老师,有必要声明counter并且每次更新吗,一旦top非真,说明数组已经空了,直接else{ onAllLoaded();} ,这样可以吗?
    回复 有任何疑惑可以回复我~ 2019-07-02 20:14:04
  • 操作风骚啊
    回复 有任何疑惑可以回复我~ 2020-06-06 11:55:23
su1per 2019-07-03 15:59:13

答主的答案才用了async await, 会让100张图片变成同步顺序加载,会耗时很久

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信