小编典典

对Array.map使用异步等待

javascript

给出以下代码:

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

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

产生以下错误:

TS2322:类型’Promise []’无法分配给类型’number []’。类型’Promise
不可分配给类型’number’。

我该如何解决?怎样才能让async awaitArray.map一起工作?


阅读 480

收藏
2020-05-01

共1个答案

小编典典

这里的问题是,您正在尝试await兑现承诺而不是承诺。这没有达到您的期望。

当传递给的对象await不是Promise时,await只需立即按原样返回值,而不是尝试解析它。因此,由于您await在此处传递了(Promise对象的)数组而不是Promise,所以await返回的值就是该数组,其类型为Promise<number>[]

您需要在此处调用Promise.all返回的数组map,以便在使用前将其转换为单个Promise await

根据MDN文档Promise.all

Promise.all(iterable)方法返回一个promise,当可迭代参数中的所有promise都已解决时,该promise会解决;或者以第一个传递的promise拒绝为由拒绝。

因此,在您的情况下:

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

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

2020-05-01