如何解决正在Array.map同步中使用异步函数
processImage()
是一种异步处理图像的功能。
uploadImage()
是一种异步上传图像的功能。
他们两个都返回Promises。
sizes
是长度为4的数组。
只有在处理完图像后才能上传图像。单一尺寸的上传和处理不能并行进行。
我要做的是一个接一个地立即启动所有4个进程/上载作业,并使它们一起异步执行。完成所有四个步骤后,我将执行其他一些代码。
由于我要传递异步函数作为要映射的参数,因此其中的await
关键字会暂停执行,直到完成对第一张图像的处理/上传为止吗?在这种情况下,这将成为同步执行。我不明白这里到底发生了什么。如果此代码确实是同步的,如何使它异步?
var responses = await Promise.all(sizes.map(async function (size) {
let processedBuffer = await processImage(buffer,size);
let response = await uploadImage(processedBuffer.toString('base64'));
return response;
}));
//some other code
解决方法
您的代码是异步的。您可以轻松地自己检查它。
const mockAsyncFn = () =>
new Promise(resolve => setTimeout(() => resolve(),2000));
const someAsync = async () => {
const from = new Date();
await Promise.all(
[mockAsyncFn,mockAsyncFn].map(async fn => await fn())
);
const to = new Date();
return to - from;
};
(async () => console.log(await someAsync()))();
结果将是2秒,但不是4秒。
, async
是返回promise的函数的语法糖。
考虑以下简单示例:
async function ret42() {
return 42;
}
这等效于:
function ret42() {
return Promise.resolve(42);
}
根据这种观点,在您遇到await
(这是.then(() =>
的语法糖)之前,回调中的异步函数是同步的。
如果您希望每个函数都达到末尾才能执行下一个函数,则必须使用for await
,或者只是:
for (const fn of sizes) {
await fn();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。