给定以下代码:
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 await
和 Array.map
一起工作?
原文由 Alon 发布,翻译遵循 CC BY-SA 4.0 许可协议
这里的问题是您正在尝试
await
一系列承诺而不是承诺。这不符合您的预期。当传递给
await
的对象不是 Promise 时,await
会立即按原样返回值,而不是尝试解析它。因此,由于您在这里传递了一个数组(Promise 对象)而不是 Promise,所以await
返回的值就是该数组,它的类型是Promise<number>[]
。您可能想要做的是在
map
返回的数组上调用Promise.all
,以便在await
之前将其转换为单个 Promise 。根据
Promise.all
的 MDN 文档:所以在你的情况下:
这将解决您在此处遇到的特定错误。
根据你想要做什么,你也可以考虑使用
Promise.allSettled
、Promise.any
或Promise.race
代替Promise.all
,尽管在大多数情况下(几乎肯定包括这个)Promise.all
会成为你想要的那个。