gpt4 book ai didi

javascript - 为什么等待 promise 不等待 promise 解决?

转载 作者:行者123 更新时间:2023-11-28 17:15:51 25 4
gpt4 key购买 nike

我正在尝试学习正确使用异步等待,但我对此感到有点困惑。

在代码片段中,我尝试构建一个对象数组,其中包含我在组件中上传的文件所需的信息。问题是 this.fileInfo 中的对象并没有完全等待返回编码图像的 promise ,而是在我 console.log this.fileInfo 时返回此输出:

output

如您所见,关键图像是一个 ZoneAwarePromise,其值未定义。你能帮我解决这个问题吗?

函数构建()

async build(e) {
let files = e.target.files;
this.j = Array.from(files);
this.fileInfo = await this.j.reduce((acc, cur) => [
...acc, {
name: cur.name.replace(/^.*\\/, ""),
sizeunit: this.getSize(cur.size),
extention: cur.name.split(/\.(?=[^\.]+$)/).slice(-1).pop().toString(),
image: this.previewFile(cur)
}
], [])
console.log(await this.fileInfo);
}

promise

async previewFile(file) {

const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
return new Promise((res) => {
res(reader.result)
}).then( res => res);
};
}

最佳答案

您不会在此函数中等待任何内容:async PreviewFile(file)。也许您认为在代码行的某个地方返回一个新的 Promise 会使其发挥 Promise 的作用。在这种特殊情况下,它将不起作用,因为它位于委托(delegate)(onload)内部,不会在函数 previewFile() 的范围内执行。

您可能会丢失 async 修饰符,因为您可以返回 Promise:

previewFileAsync(file) {
// the async modifier keyword is not necessary,
// because we don't need to await anything.
return new Promise((res) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => res(reader.result);
});
}

当您调用此函数时,您可以在循环内等待它:

async buildAsync(e) {
let files = e.target.files;
for(let i = 0; i < files.length; i++) {
const file = files[i];
const preview = await previewFileAsync(file);
// Do something with preview here...
}
}

当然,您可以执行一系列 promise 以允许某种并发性,但这将帮助您入门。

我在您的方法中添加了 Async 后缀,以便调用者知道可以等待此操作。它没有做任何特别的事情,但它有助于澄清你的代码。您可以使用您认为正确的任何后缀。我只是习惯了 Async 后缀。

编辑

Stackblitz example of async logic

关于javascript - 为什么等待 promise 不等待 promise 解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53504679/

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