Я использую 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]
не должно быть неопределенным.
Не выполняйте первые 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(...);
});