Здесь вы должны вернуть результат из второго API, просто для вызова второго API вам нужен результат из первого.Для этого switchMap()
подходит вам лучше всего.Используйте его, как описано в коде.
this.subOb = this.quoteService.get(this.quoteid) //first api call
.pipe(switchMap((quote: Quote) => {
// result of first API call here
this.deviceid = quote["deviceid"];
// you need to return the second observable from inside the switcMap
// and this will only be executed after the first Observable(first API call) is finished
return this.faultService.get(this.deviceid) //second api call
// need some mode logic after second API call is done? call first()?
// map the result with a pipe
.pipe(map(secondData) => {
// If you aren't manipulating the data
// to be returned, then use tap() instead of map().
return data;
})
}))
.subscribe((data) => {
// only one subscription is required.
// this will have data from second API call
})
Используйте крюк ngOnDestroy()
для unsubcribe()
для Subscriptions
.Я вижу, что вы назначаете подписку на переменную и, вероятно, делаете то же самое, чтобы отписаться.Если ваш Observable испускает несколько раз (что я думаю, что нет), то во время первой эмиссии, когда дело доходит до subscribe()
, переменная «подписка» будет неопределенной.
ngOnDestroy() {
if (this.subOb) {
this.subOb.unsubscribe();
}
}
См. Пример примераздесь: https://stackblitz.com/edit/swicthmap?file=src%2Fapp%2Fapp.component.ts
Он содержит две реализации карт переключателей, анализирует обе и использует все, что вам подходит.