#angular #typescript #observable
#угловой #машинописный текст #наблюдаемый
Вопрос:
У меня есть два вызова api, которые возвращают разные ответы. Эти ответы строго типизированы в TestData1Res и TestData2Res. Как мне указать, что ответ может быть одним из них, а затем обработать свойство
`TestData1Res{ Тестовые данные: строка }
TestData2Res{ данные: строка }
this.getData1().pipe(catchError(error =gt; this.getData2())) .subscribe( (res: TestData1Res|TestData2Res) =gt; { if (res.testData) { //error 'Property 'testData' does not exist on type 'TestData1Res | TestData2Res' } if (res.data) { //error 'Property 'data' does not exist on type 'TestData1Res | TestData2Res' } } );`
Комментарии:
1. вы хотите звонить
getData2()
только после того, как получите сообщение об ошибке при вызовеgetData1()
?2. вы не должны обрабатывать ошибки таким образом. вы должны вернуть пустое наблюдаемое в случае ошибки, а затем использовать switchmap для вызова службы ur 2.
Ответ №1:
Может быть полезно использовать динамический тип данных
this.getData1().pipe(catchError(error =gt; this.getData2())) .subscribe( (res: any) =gt; { if (res["testData"]) { } if (res["data"]) { } } );
Ответ №2:
если вы хотите вызвать один вызов API после получения ответа от другого
this.getData1().subscribe(data =gt; { // success getdata1 this.getData2().subscribe(data =gt; { //success getdata2 }, err =gt; { // getdata2 error }) }, err =gt; { //getdata1 error })
если вы хотите вызвать оба сразу, вы можете использовать forkjoin из rxjs
forkjoin([this.getData1(), this.getData2()]).subscribe(result =gt; { // result[0] - getdata1 result // result[1] - getdata2 result }, err =gt; { // err if something goes wrong })