TypeScript等待promise.all并返回结果

时间:2019-01-29 03:06:27

标签: node.js typescript promise async-await

我正在Node.Js中编写一些代码,并使用promise.all进行并行执行。为了简化问题,我使用以下示例代码

在MyService.ts

HEAD

@Injectable() export class MyService { constructor(private readonly anotherService: AnotherService) { } public async job1(a: number): Promise<MyObject> { // try to calculate the result in parallel. const promiseArray = []; promiseArray.push(this.anotherService.job2(a)); promiseArray.push(this.anotherService.job2(a + 1)); promiseArray.push(this.anotherService.job2(a - 1)); await Promise.all(promiseArray).then((results: MyObject[]) => { for (const obj of results) { if (obj.Index === 1) { return obj; } } }); return null; } } 的返回类型为anotherService.job2()

我准备了测试数据,将断点设置为Promise<MyObject>return obj;,然后它首先在return null;处停下来,然后在return obj;处停下来。因此,此函数的调用者最终将获得return null;

如果我将代码更改为

null

有效。

使用@Injectable() export class MyService { constructor(private readonly anotherService: AnotherService) { } public async job1(a: number): Promise<MyObject> { // try to calculate the result in parallel. const promiseArray = []; promiseArray.push(this.anotherService.job2(a)); promiseArray.push(this.anotherService.job2(a + 1)); promiseArray.push(this.anotherService.job2(a - 1)); const results = await Promise.all(promiseArray); for (const obj of results) { if (obj.Index === 1) { return obj; } } return null; } } 并从中返回结果的正确方法是什么?我什么时候应该使用Promise.all

1 个答案:

答案 0 :(得分:1)

第一版代码的问题在于,您只为null函数返回了job1

您可以这样重写,请注意我们正在返回then的结果:

...
        return await Promise.all(promiseArray).then((results: MyObject[]) => {
            for (const obj of results) {
                if (obj.Index === 1) {
                    return obj;
                }
            }

            return null;
        });
...

要回答您的问题,何时使用什么时间。我认为这归结于您发现的两种方法中最简单,最易于阅读和维护的方法。

我个人更喜欢您的第二种方法。