我试图获取一些数组元素的值。对于元素[0]、[1]、[2]、[3]可以正常工作,但是对于[4]不能正常工作。
function getBase64() {
const urls = ['https://i.imgur.com/egNg7JU.jpg',
'https://i.imgur.com/RLZ7WH1.jpg', 'https://i.imgur.com/qfabBbA.jpg',
'https://i.imgur.com/Zuh1KaX.jpg', 'https://i.imgur.com/yD7X6Q1.jpg'
];
let base64urls = [];
const start = async () => {
await asyncForEach(urls, async (num) => {
await waitFor(50)
toDataURL(num, function(dataURL) {
base64urls.push(dataURL);
});
})
console.log(base64urls);
console.log(base64urls[4]);
}
start()
}
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}
const waitFor = (ms) => new Promise(r => setTimeout(r, ms))
toDataURL
简单地返回图像的 base64 值。每当我尝试 console.log(base64urls[4])
时,它会返回 'undefined'。我确实获得了前面元素的正确值。是否有一些重构的方式,或者使用不同的方法来等待数组完全填充后再检查其元素的值?
编辑
这是我的 toDataURL
:
function toDataURL(src, callback) {
const image = new Image();
image.crossOrigin = 'Anonymous';
image.onload = function () {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.height = this.naturalHeight;
canvas.width = this.naturalWidth;
context.drawImage(this, 0, 0);
const dataURL = canvas.toDataURL('image/jpeg');
callback(dataURL);
};
image.src = src;
}
await waitFor(50)
为什么要加一个短暂的暂停?听起来你并没有等待异步操作完成,而是在盲目地猜测等待足够的时间。 - Jaromanda X