gpt4 book ai didi

Javascript - 等待数组完成填充

转载 作者:行者123 更新时间:2023-12-01 15:54:09 26 4
gpt4 key购买 nike

我正在尝试获取一些数组元素的值。它适用于元素 [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]) 时,它都会返回“未定义”。我确实得到了前面元素的正确值。有什么方法可以重组它,或者使用不同的方法等待数组完全填充,然后再检查其元素的值?

编辑

这是我的 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;
}

最佳答案

看起来 toDataURL 是异步的和基于回调的 - 要么改变它,让它返回一个 Promiseawait 那个 Promise,或者将 Promiseresolve 传递给回调:

async 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'];
const base64urls = [];
for (const url of urls) {
const dataURL = await new Promise(resolve => toDataURL(url, resolve));
base64urls.push(dataURL);
}
console.log(base64urls);
console.log(base64urls[4]);
}

如果您想更改您的 toDataURL 函数以返回一个 Promise,这样您就不必将其视为回调:

function toDataURL(src) {
return new Promise(resolve => {
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');
resolve(dataURL);
};
image.src = src;
});
}

然后 const dataURL = await toDataURL(url)

关于Javascript - 等待数组完成填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50671745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com