接口请求只需要替换loadImage方法即可,逻辑类似
方式一有部分缺点
var urls = [
'https://www.kkkk1000.com/images/getImgData/getImgDatadata.jpg',
'https://www.kkkk1000.com/images/getImgData/gray.gif',
'https://www.kkkk1000.com/images/getImgData/Particle.gif',
'https://www.kkkk1000.com/images/getImgData/arithmetic.png',
'https://www.kkkk1000.com/images/getImgData/arithmetic2.gif',
'https://www.kkkk1000.com/images/getImgData/getImgDataError.jpg',
'https://www.kkkk1000.com/images/getImgData/arithmetic.gif',
'https://www.kkkk1000.com/images/wxQrCode2.png'
]
function loadImg(url) {
return new Promise((resolve, reject) => {
const img = new Image;
img.onload = () => {
console.log("加载完成", url);
resolve()
}
img.src = url;
img.onerror = reject
})
}
function preLoad(urls, limit) {
let urlsCopy = urls.slice(0);
let queue = urlsCopy.slice(0, limit).map((url, index) => loadImg(url).then(() => index).catch(() => index));
return urlsCopy.slice(limit).reduce((prev, currentUrl, currentIndex) => {
return prev.then(() => {
return Promise.race(queue).then(index => {
return loadImg(currentUrl).then(() => {
queue[index] = currentIndex
})
})
})
}, Promise.resolve()).then(() => Promise.allSettled(queue))
}
preLoad(urls, 8).then(res => {
console.log(res);
console.log("全部加载完成");
})
更好的方式2
export function preloadImage(urls: string[], limit = 5) {
const copyurls = [...urls];
function loadImage(url: string) {
return new Promise<string | HTMLImageElement>(resolve => {
const image = lynx.createImage(url);
image.addEventListener('load', () => {
console.log(url, '加载成功');
resolve(image);
});
image.addEventListener('error', () => {
console.error(url, '加载失败');
resolve(url);
});
});
}
const taskQueue = copyurls.slice(0, limit).map((url, index) => loadImage(url).then(() => index));
copyurls.splice(0, limit);
function enqueue(index: number): Promise<void> {
if (copyurls.length === 0) {
return Promise.resolve();
}
taskQueue.splice(
index,
1,
loadImage(copyurls.shift()!).then(() => index)
);
return Promise.race(taskQueue).then(currentIndex => enqueue(currentIndex));
}
return Promise.race(taskQueue)
.then(enqueue)
.then(() => Promise.all(taskQueue));
}
const urls = [
'https://www.kkkk1000.com/images/getImgData/getImgDatadata.jpg',
'https://www.kkkk1000.com/images/getImgData/gray.gif',
'https://www.kkkk1000.com/images/getImgData/Particle.gif',
'https://www.kkkk1000.com/images/getImgData/arithmetic.png',
'https://www.kkkk1000.com/images/getImgData/arithmetic2.gif',
'https://www.kkkk1000.com/images/getImgData/getImgDataError.jpg',
'https://www.kkkk1000.com/images/getImgData/arithmetic.gif',
'https://www.kkkk1000.com/images/wxQrCode2.png',
];
preloadImage(urls).then(() => {
console.error('全部加载成功');
});