Angular 4 - Promise.all не работает

Я использую Promise.all(...), чтобы дождаться завершения некоторых вызовов REST, прежде чем использовать данные, которые мне нужны с сервера. Структура кода следующая:

const promise1 = this.myService.myFirstRestFunction(a.id).toPromise().then(s => variable1 = s;);

const promise2 = this.myService.mySecondRestFunction(b.id).then(r => {
  this.myService.myThirdRestFunciont(r.id).then(c => variable2 = c);
});

Promise.all([promise1, promise2]).then(p => {
  this.myService.getData(variable1.id, variable2.id)
    .subscribe(...);
});

Но variable2 не определен, когда я пытаюсь получить поле id. Связано ли это с вызываемым внутри myThirdRestFunction()? Если это так, как я могу управлять такими последовательными вызовами REST и ждать, пока будет извлечено большинство внутренних данных? Спасибо.

РЕДАКТИРОВАТЬ: Я изменил свой код после ответов @Suren Srapyan и @Sachila Ranawaka.

const promise1 = this.myService.myFirstRestFunction(a.id).toPromise();

const promise2 = this.myService.mySecondRestFunction(b.id).then(r => {
  this.myService.myThirdRestFunciont(r.id);
});

Promise.all([promise1, promise2]).then(p => {
  this.myService.getData(p[0].id, p[1].id)
    .subscribe(...);
});

В этом случае я правильно получаю p[0], но p[1] все еще не определен. Если я попытаюсь выполнить второе обещание, например:

const promise2 = this.myService.mySecondRestFunction(b.id).then(r => {
      this.myService.myThirdRestFunciont(r.id).then(c => console.info(c));
    });

Объект c правильно зарегистрирован, поэтому значение p[1] не должно быть неопределенным.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
657
2

Ответы 2

Не выполняйте первые 2 обещания. Promise.all выполнит все обещания за вас

const promise1 = this.myService.myFirstRestFunction(a.id).toPromise() 
const promise2 = this.myService.mySecondRestFunction(b.id) 

Promise.all([promise1, promise2]).then(p => {
  this.myService.getData(variable1.id, variable2.id)
    .subscribe(...);
});

Вам не нужно присваивать переменные. Promise.all разрешит все обещания, если это возможно, и передаст их результаты в параметр p в виде массива.

Просто верните свои данные из функций then и получите доступ через p[0] и p[1] в Promise.all(...).then(p => ...).

const promise1 = this.myService.myFirstRestFunction(a.id).toPromise()

const promise2 = this.myService.mySecondRestFunction(b.id)
                               .then(r => this.myService.myThirdRestFuncion(r.id));

Promise.all([promise1, promise2]).then(p => {
  this.myService.getData(p[0].id, p[1].id).subscribe(...);
});

Я не знаю, что возвращают ваши обещания, поэтому я предоставляю p[0].id. Измените это в соответствии с вашим результатом.

Для более красивого кода вы также можете разрушить параметры

Promise.all([promise1, promise2]).then(([var1, var2]) => {
    this.myService.getData(var1.id, var2.id).subscribe(...);
});

Другие вопросы по теме