Skip to content

并发限制图片加载数量

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 );