我希望为我的承诺设定一个最短持续时间。
我尝试了以下代码:
const preloadImages = (selector = '[data-lg-loadImg]') => {
return Promise.all(Array.from(document.querySelectorAll(selector)).map(el => {
const img = new Image();
img.src = el.getAttribute("src");
if (img.complete)
return Promise.resolve(img.naturalHeight !== 0);
return new Promise(resolve => {
img.addEventListener('load', () => resolve(true));
img.addEventListener('error', () => resolve(false));
});
}),
new Promise(resolve => {
setTimeout( resolve => { resolve(true) }, 5000 );
})
)
};
preloadImages 应在所有图像加载完毕且至少 5000 毫秒结束后返回。 上面的代码不起作用。它在所有图像加载后返回,与 setTimeout() 无关。如何实现?
修改代码,使
Promises.all
接受数组:
const preloadImages = (selector = '[data-lg-loadImg]') => {
const imagePromises = Array.from(document.querySelectorAll(selector)).map(el => {
const img = new Image();
img.src = el.getAttribute("src");
if (img.complete)
return Promise.resolve(img.naturalHeight !== 0);
return new Promise((resolve) => {
img.addEventListener('load', () => resolve(true));
img.addEventListener('error', () => resolve(false));
});
});
const timeoutPromise = new Promise(resolve => setTimeout(() => resolve(true), 5000));
return Promise.all([...imagePromises, timeoutPromise]);
};