给出以下代码:
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一起工作?
async await
Array.map
这里的问题是,您正在尝试await兑现承诺而不是承诺。这没有达到您的期望。
await
当传递给的对象await不是Promise时,await只需立即按原样返回值,而不是尝试解析它。因此,由于您await在此处传递了(Promise对象的)数组而不是Promise,所以await返回的值就是该数组,其类型为Promise<number>[]。
Promise<number>[]
您需要在此处调用Promise.all返回的数组map,以便在使用前将其转换为单个Promise await。
Promise.all
map
根据MDN文档Promise.all:
该Promise.all(iterable)方法返回一个promise,当可迭代参数中的所有promise都已解决时,该promise会解决;或者以第一个传递的promise拒绝为由拒绝。
Promise.all(iterable)
因此,在您的情况下:
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; }));
这将解决您在此处遇到的特定错误。