为了账号安全,请及时绑定邮箱和手机立即绑定

在 Array.map 同步中使用异步函数

在 Array.map 同步中使用异步函数

喵喔喔 2023-04-14 16:40:19
processImage()是一个异步处理图像的函数。uploadImage()是一个异步上传图片的函数。他们都返回承诺。sizes是长度为4的数组。图像应仅在处理后上传。单一尺寸的上传和处理不能并行进行。我想要做的是一个接一个地立即启动所有 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
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

您的代码是异步的。您可以自己轻松检查。


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()))();

结果将是 ~2s 但不是 4。


查看完整回答
反对 回复 2023-04-14
?
达令说

TA贡献1821条经验 获得超6个赞

async是返回承诺的函数的语法糖。

考虑这个简单的例子:

async function ret42() {
   return 42;
}

这相当于:

function ret42() {
   return Promise.resolve(42);
}

从这个角度来看,回调中的异步函数是同步的,直到遇到一个await(这是语法糖.then(() => )。

如果您希望每个函数都执行完才能执行下一个函数,则必须使用for await, 或者只是:

for (const fn of sizes) {
 await fn();
}


查看完整回答
反对 回复 2023-04-14
  • 2 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信