并发限制图片加载数量
js
function loadImage(url, index) {
return new Promise((resolve, reject) => {
console.log(`#${index} url: ${url} start`);
setTimeout(() => {
console.log(`url: ${url} ok`);
resolve();
}, 500);
});
}
function limitLoad(urls, handler, limit) {
const sequence = [...urls];
// 存储异步处理函数的结果
let promises = [];
// 限流加载前 limit 个 url
promises = sequence.splice(0, limit).map((url, index) => {
return handler(url, index).then(() => index);
});
// 先执行第一轮,然后循环处理剩余 url
let p = Promise.race(promises);
for (let i = 0; i < sequence.length; i++) {
p = p.then((data) => {
promises[data] = handler(sequence[i], i).then(() => data);
return Promise.race(promises);
});
}
}
// 加载 10 张图片,并发量为 3
limitLoad(
[
"https://example.com/article-1",
"https://example.org/gallery/image-2.jpg",
"https://samplewebsite.net/blog/post-3",
"https://anotherwebpage.com/videos/watch?v=video-4",
"https://api.example.io/data/v1/resource-5",
"https://www.example-edu.com/courses/course-6",
"https://news-sites.com/top-stories/story-7",
"https://e-commerce-site.com/products/product-8",
"https://docs.example-help.com/guides/guide-9",
"https://social-media-platform.com/profile/user-10",
],
loadImage,
3
);