Принудительно вызвать внутреннюю наблюдаемую из switchMap, если внешняя наблюдаемая вернула ошибку - PullRequest
1 голос
/ 06 февраля 2020

Мой код:

    return this.userService.getPosition().pipe(
      switchMap(() => {
        return this.get('/places', { point: this.userService.coords });
      }),
    );

Возможен случай, когда невозможно получить позицию (нет https в Google Chrome или пользователь не разрешен).

In в этом случае мне все еще нужно вернуть return this.get('/places', { point: this.userService.coords });

Только в этом вызове this.userService.coord будет null.

Сервисный код:

export class UserService {
  constructor() {}

  coords: Coordinates;

  getPosition(): Observable<any> {
    return new Observable(observer => {
      if (window.navigator && window.navigator.geolocation) {
        window.navigator.geolocation.getCurrentPosition(
          position => {
            this.coords = [position.coords.latitude, position.coords.longitude];
            observer.next(this.coords);
            observer.complete();
          },
          error => observer.error(error),
        );
      } else {
        this.coords = null;
        observer.error('Unsupported Browser');
      }
    });
  }
}

В настоящее время - если внешняя наблюдаемая возвратила ошибку, внутренняя наблюдаемая не вызывается (возвращается).

1 Ответ

0 голосов
/ 06 февраля 2020

Для этого вы можете использовать catchError .

Я не знаю, какие именно типы вы используете, но это должно выглядеть примерно так.

Пример:

return this.userService.getPosition().pipe(
  catchError((error) => {
      // We catched the error and are telling the pipeline to continue and
      // use the provided value.
      return of(this.userService.coords);
  }),
  switchMap(point => {
    // The following line will be reached regardless of any error that has occurred earlier in the pipeline.
    return this.get('/places', { point: point });
  }),
);
...