给定以下代码:
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>[]”不能分配给类型“number[]”。
类型'Promise<number>不能分配给类型'number'。
我该怎么解决呢?我如何使异步等待和数组。地图一起工作?
如果你使用的不是本地承诺而是蓝鸟,还有另一个解决方案。
您还可以尝试使用Promise.map(),混合数组。地图和承诺。所有
对你来说:
var arr = [1,2,3,4,5];
var results: number[] = await Promise.map(arr, async (item): Promise<number> => {
await callAsynchronousOperation(item);
return item + 1;
});
如果你使用的不是本地承诺而是蓝鸟,还有另一个解决方案。
您还可以尝试使用Promise.map(),混合数组。地图和承诺。所有
对你来说:
var arr = [1,2,3,4,5];
var results: number[] = await Promise.map(arr, async (item): Promise<number> => {
await callAsynchronousOperation(item);
return item + 1;
});
我在BE方面有一个任务,从回购中找到所有实体,并添加一个新的属性url并返回到控制器层。这就是我如何做到的(感谢Ajedi32的回应):
async findAll(): Promise<ImageResponse[]> {
const images = await this.imageRepository.find(); // This is an array of type Image (DB entity)
const host = this.request.get('host');
const mappedImages = await Promise.all(images.map(image => ({...image, url: `http://${host}/images/${image.id}`}))); // This is an array of type Object
return plainToClass(ImageResponse, mappedImages); // Result is an array of type ImageResponse
}
注意:Image(实体)没有属性url,但imagerresponse -有
你可以使用:
for await (let resolvedPromise of arrayOfPromises) {
console.log(resolvedPromise)
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of
如果你想使用Promise.all(),你可以使用promise . allsettle ()
所以你可以更好地控制被拒绝的承诺。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled