Нельзя ли ловить ошибки внутри подписки? - PullRequest
1 голос
/ 28 марта 2019

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

Я не могу понять, что я должен делать в этом сценарии.

У меня есть служба, которая вызывает API.

getObjectValue(param: paramtype): Observable<ObjectValue> {
    return this.http.get<objectwithvalues>(environment.baseapiurl + '/api/object/value/'+ param);
  }

В потребляющем компоненте я подписываюсь как обычно

testfunction() {
   this.service.getObjectValue().Subscribe(v => {
    *DO STUFF*
    *Error happens* v['o'] // oh no v is null
   },
    error=>{
     console.log('error') 
     this.snackbar.open('this went wrong' + error); 
    }
  );
}

Это основной случай.Это не вызывает 'error => {}' Angular просто выплевывает сообщение об ошибке.

Итак, я попробовал попробовать / поймать в рамках обратного вызова подписки.Не перехватил.

В настоящее время я пытаюсь изменить код услуги на следующий

getObjectValue(param: paramclass): Observable<ObjectValue> {
    return this.http.get<EventWifi>(
      environment.baseapiurl + '/api/object/value/'+ param).pipe(map(v=> {
   if(v === null){
     return throwError('v is null');  
   } 
  }),
   catchError(err => this.errorTest(err))
);
  }

this.errorTest(err: any): Observable<any> {
 return throwError(err);

}

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

С последней показанной сервисной функцией не возникает никаких ошибок.

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

Я посмотрел так много примеров, но ни один из них не срабатывает и не работает в моем случае.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Ваша ошибка в том, что вы возвращаете Наблюдаемую Наблюдаемую при выполнении throwError в map, вместо этого используйте mergeMap.

return this.http.get<EventWifi>(url).pipe(mergeMap(v=> {
   if(v === null){
     return throwError('v is null');  
   } else {
        return of(v)
   } 
})

При подписке Наблюдаемая не является ошибкой.

https://stackblitz.com/edit/angular-uglwbm

1 голос
/ 28 марта 2019

Проблема в том, что вы пытаетесь обработать ошибку внутри вашей функции подписки. Это никогда не достигнет вашей функции ошибки, просто потому что не может. Вы должны выбросить ошибку изнутри трубы. Предпочтительно в mergeMap:

getObjectValue(param: paramtype): Observable<ObjectValue> {
  return this.http.get(environment.baseapiurl + '/api/object/value/'+ param).pipe(
    mergeMap((v) => v == null ? throwError('v is null') : of(v)) 
  );
}

Затем вы можете сделать это:

testfunction() {
  this.service.getObjectValue().subscribe((v) => {
    // v will never be null
  },
  (error) => {
    console.log('error') 
    this.snackbar.open('this went wrong' + error); 
  });
}

Если это часто происходит в вашем приложении, вы можете создать HttpInterceptor, который сделает это за вас. Вы можете заставить его сгенерировать http-вызов с определенным кодом ошибки и номером, если возвращаемое значение равно нулю.

...