TypeScript дождаться обещания. Все и вернуть результат - PullRequest
0 голосов
/ 29 января 2019

Я пишу некоторый код в Node.Js и использую promise.all для параллельного выполнения.Чтобы упростить проблему, я использую следующий пример кода

в MyService.ts

@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 и вернуть результат из него?Когда я должен использовать Promise.all().then()?

1 Ответ

0 голосов
/ 29 января 2019

Проблема с первой версией вашего кода заключается в том, что вы только когда-либо возвращаете null для функции job1.

Вы можете переписать это так, обратите внимание, что мы возвращаем результатзатем:

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

            return null;
        });
...

Чтобы ответить на ваш вопрос, когда использовать, когда.Я думаю, что все сводится к тому, какой из двух подходов, которые вы найдете, является самым простым, легким для чтения и поддержки.

Я лично предпочитаю ваш второй подход.

...