javascript – 对Array.map使用async await

给出以下代码

var arr = [1,2,3,4,5];

var results: number[] = await arr.map(async (item): Promise<number> => {
        await callAsynchronousOperation(item);
        return item + 1;
    });

这会产生以下错误

TS2322: Type ‘Promise<number>[]’ is not assignable to type ‘number[]’.
Type ‘Promise<number> is not assignable to type ‘number’.

我该如何解决?如何使异步await和Array.map一起工作?

解决方法:

这里的问题是你试图等待一系列的承诺而不是承诺.这不符合您的期望.

当传递给await的对象不是Promise时,await只是立即返回值,而不是尝试解析它.因此,既然你在这里传递了一个数组(Promise对象)而不是Promise,那么await返回的值就是那个类型为Promise< number> []的数组.

你需要做的是在map返回的数组上调用Promise.all,以便在等待之前将其转换为单个Promise.

根据MDN docs for Promise.all

The Promise.all(iterable) method returns a promise that resolves
when all of the promises in the iterable argument have resolved, or
rejects with the reason of the first passed promise that rejects.

所以在你的情况下:

var arr = [1, 2, 3, 4, 5];

var results: number[] = await Promise.all(arr.map(async (item): Promise<number> => {
    await callAsynchronousOperation(item);
    return item + 1;
}));

这将解决您在此遇到的特定错误.

相关文章

我最大的一个关于TypeScript的问题是,它将原型的所有方法(无...
我对React很新,我正在尝试理解子组件之间相互通信的简洁方法...
我有一个非常简单的表单,我将用户电子邮件存储在组件的状态,...
我发现接口非常有用,但由于内存问题我需要开始优化我的应用程...
我得到了一个json响应并将其存储在mongodb中,但是我不需要的...
我试图使用loadsh从以下数组中获取唯一类别,[{"listing...