javascript - 使用 async/await 意外执行代码
问题描述
我正在尝试将 localhost URL 数组转换为 base64 字符串。
let uploadedBase64Images = [];
for (let i = 0; i < urls.length; i++) {
let img = await fetch(urls[i]);
let imgBlob = await img.blob();
let reader = new FileReader();
let base64;
reader.readAsDataURL(imgBlob);
reader.onloadend = () => {
console.log(reader.result)
base64 = reader.result;
console.log(base64)
uploadedBase64Images.push(base64)
};
}
console.log(uploadedBase64Images)
我注意到的一件事是console.log(uploadedBase64Images)
总是打印 before console.log(base64)
。此代码块也包含在异步函数中。我尝试了许多其他方法,但在一天结束时,uploadedBase64Images
总是空的。
当我移出uploadedBase64Images.push(base64)
时reader.onloadend
,即:
reader.onloadend = () => {
console.log(reader.result)
base64 = reader.result;
console.log(base64)
};
uploadedBase64Images.push(base64)
uploadedBase64Images
是[undefined]
,这让我相信 Promise 没有得到解决?
感谢您对此的任何帮助,在此先感谢!
解决方案
据我所知,问题在于reader.onloadend
,它在自己的区域中,没有遵循异步行为。
因此,通过将 reader 函数包装到 Promise 以在执行任何操作之前等待其响应可能会解决您的问题
// wrapping reader in Promise
const convertImageToBase64 = async(imgBlob) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(imgBlob);
reader.onloadend = () => {
resolve(reader.result);
};
reader.onerror = reject
})
}
const uploadedBase64Images = [];
for (let i = 0; i < urls.length; i++) {
const img = await fetch(urls[i]);
const imgBlob = await img.blob();
const base64 = await convertImageToBase64(imgBlob)
uploadedBase64Images.push(base64)
}
console.log(uploadedBase64Images)
推荐阅读
- kotlin - 协程中的 Kotlin 异步:异常被捕获并仍在传播?
- javascript - Three.js - 如何从自己的角度旋转对象?
- c# - System.Data.SqlClient.SqlException(提供者:SQL 网络接口,错误:50 - 本地)错误
- python - 当我使用 pygame 混音器在主游戏循环中运行声音时,声音会在每个循环之间滞后并中断,我该如何解决这个问题?
- python - Numpy pColormesh TypeError:C 的尺寸与 X 和/或 Y 不兼容,请参阅帮助(pcolormesh)
- laravel - 我没有加入 ad_categories 表的数据
- laravel - 如何在 Heroku 中为自定义域生成 ssl 证书的 CSR?
- python - 使用arabic-reshaper和python-bidi(在多行情况下)时如何修复反向行?
- r - 使用一个命令仅显示特定统计数据(中位数、平均值、标准差、变量、最小值、最大值、分位数)。没有额外的统计数据
- python - Django Query 将多个 ArrayFields 组合成一个文本字符串