正在Array.map synchronous中使用异步函数



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

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

他们两个都返回Promises。

CCD_ 3是长度为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

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

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

最新更新