RxJS - Использование наблюдаемого в блоке catchError - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть 2 службы budgetTestService и budgetService, мне нужно использовать budgetTestService, когда есть ошибка, и budgetService, когда нет ошибки.Карта () в канале budgetTestService.getBudgetService() не вызывается - console.log('test service complete');

Не уверен, если это так, как это должно быть сделано, похоже, что я вложения и делаю это неправильно, яправильно использовать синтаксис?

this.budgetService.getBudgetDays(this.startDate, this.finishDate)
    .pipe(
      map(res => {
        console.log('get budget day server mapping');
        self.timelineBudgetDates = self.processDates(res);

      }),
      //map(res => {
      //  self.timelineBudgetDates = self.budgetTestService.getBudgetDates(self.startDate, self.finishDate);
      //})
      catchError(error => {
        console.log('error code running');
        console.log(error);
        self.budgetTestService.getBudgetDates(self.startDate, self.finishDate)
                              .pipe(
                                map(res => {
                                  console.log('test service complete');
                                  console.log(res);
                                  self.timelineBudgetDates = res;
                                })
                              );
        return of('some return value, maybe null, maybe a good default');
      })
    )

    .subscribe(res => {
      console.log('Response = ', res);
      //self.timelineBudgetDates = self.processDates(res);
      //self.timelineBudgetDates = res;

    });

budgetTestService:

getBudgetDates(startDate: string, endDate: string): Observable<BudgetDate[]> {

    console.log('getting budget dates from test service');

    let dates = this.datesOfRange(moment(startDate), moment(endDate));
    //console.log('dates:', dates);

    let budgetDates: BudgetDate[] = [
      new BudgetDate({ moment: moment().subtract(1, 'd').startOf('d'), earned: 100, spent: 50, onServer: true }),
      new BudgetDate({ moment: moment().subtract(2, 'd').startOf('d'), earned: 101, spent: 51, onServer: true }),
      new BudgetDate({ moment: moment().subtract(3, 'd').startOf('d'), earned: 102, spent: 52, onServer: true }),
      new BudgetDate({ moment: moment().subtract(4, 'd').startOf('d'), earned: 103, spent: 53, onServer: true })
    ];

    const mockResults = function(observer: Observer<BudgetDate[]>) {
      observer.next(budgetDates);
      observer.error('...');
      observer.complete;
    };
    const update = new Observable(mockResults).pipe(
      catchError((error: any) => Observable.throw(error))
    );
    return update;
  }

Вывод: Не включает: test service complete

error code running
HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: null, ok: false, …}
getting budget dates from test service
Response =  some return value, maybe null, maybe a good default

1 Ответ

0 голосов
/ 22 февраля 2019

Наблюдаемая цепочка RxJS будет выполняться только при подписке.Поэтому проблема вывода без учета test service complete заключается в том, что вы никогда не подписываетесь на тестовый сервисный вызов.В частности, проблема здесь:

catchError(error => {
  self.budgetTestService.getBudgetDates(self.startDate, self.finishDate)
    .pipe(
      // ...
    );

  // RETURNING OTHER OBSERVABLE HERE
  return of('some return value, maybe null, maybe a good default');
})
// ...
.subscribe(console.log)

Здесь вы звоните budgetTestService, но его Наблюдаемая никогда не подписывается.Сравните это с:

catchError(error => {
  return self.budgetTestService.getBudgetDates(self.startDate, self.finishDate)
    .pipe(
      // ...
    );
})
// ...
.subscribe(console.log)

В последнем примере кода мы возвращаем наблюдаемое из budgetTestService, которое будет частью цепочки подписки.

Проверьте этот небольшой пример здесь, чтобы сравнить: «Асинхронный обработчик ошибок в RxJS»

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...