haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.53k stars 3.26k forks source link

[js] 第1938天 使用promise实现,加载100张图片,每次最多同时加载5张图片 #5905

Open haizhilin2013 opened 3 months ago

haizhilin2013 commented 3 months ago

第1938天 使用promise实现,加载100张图片,每次最多同时加载5张图片

3+1官网

我也要出题

Liu-code3 commented 3 months ago

步骤1:创建加载单张图片的函数:该函数loadImage接收一个图片的URL,返回一个Promise,当图片加载成功时,调用resolve方法,否则调用reject方法。

  function loadImage(url) {
    return new Promise((resolve, reject) => {
        const img = new Image();
        img.src = url;
        img.onload = () => resolve(url);
        img.onerror = () => reject(new Error(`Failed to load image at ${url}`));
    });
}

步骤2:创建一个函数来管理加载的图片

  function loadImages(urls, maxConcurrent) {
    let index = 0; // 当前图片索引
    const results = []; // 存储加载结果
    const loading = []; // 存储正在加载的Promise

    return new Promise((resolve, reject) => {
        function next() {
            if (index >= urls.length && loading.length === 0) {
                // 所有图片都加载完毕
                resolve(results);
                return;
            }

            while (loading.length < maxConcurrent && index < urls.length) {
                const url = urls[index++];
                const promise = loadImage(url)
                    .then(result => {
                        results.push(result);
                        loading.splice(loading.indexOf(promise), 1);
                        next();
                    })
                    .catch(error => {
                        loading.splice(loading.indexOf(promise), 1);
                        reject(error);
                    });
                loading.push(promise);
            }
        }

        next();
    });