首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在使用Array.map synchronous内部的异步函数

正在使用Array.map synchronous内部的异步函数
EN

Stack Overflow用户
提问于 2020-10-02 16:33:30
回答 2查看 82关注 0票数 2

processImage()是一个异步处理图像的函数。

uploadImage()是一个异步上传镜像的函数。

它们都会返回承诺。

sizes是长度为4的数组。

图片必须经过处理后才能上传。单个大小的上传和处理不能并行进行。

我想要做的是立即一个接一个地启动所有4个处理/上传作业,并让它们一起异步执行。一旦所有4个都完成了,我就会执行一些其他的代码。

由于我将一个异步函数作为参数传递给map,那么其中的await关键字是否会暂停执行,直到第一个图像的处理/上传完成?在这种情况下,这就变成了同步执行。我不明白这里到底发生了什么。如果这段代码确实是同步的,那么如何使其异步呢?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-02 16:59:15

你的代码是异步的。你可以很容易地自己检查它。

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2020-10-02 16:57:24

async是返回promise的函数的语法糖。

考虑这个简单的例子:

代码语言:javascript
复制
async function ret42() {
   return 42;
}

这相当于:

代码语言:javascript
复制
function ret42() {
   return Promise.resolve(42);
}

在这种观点下,回调中的异步函数是同步的,直到您遇到await (这是.then(() =>的语法糖)。

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

代码语言:javascript
复制
for (const fn of sizes) {
  await fn();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64168480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档