Как бросить ошибку от (углового) оператора карты RxJS

Я хочу бросить ошибку от оператора карты своего observable на основе условия. Например, если корректные данные API не получены. См. следующий код:

private userAuthenticate( email: string, password: string ) {
    return this.httpPost(`${this.baseApiUrl}/auth?format=json&provider=login`, {userName: email, password: password})
        .map( res => { 
            if ( res.bearerToken ) {
                return this.saveJwt(res.bearerToken); 
            } else {
                // THIS DOESN'T THROW ERROR --------------------
                return Observable.throw('Valid token not returned');
            }
        })
        .catch( err => Observable.throw(this.logError(err) )
        .finally( () => console.log("Authentication done.") );
}

В основном как Вы видите в коде, если ответ (res объект) не имеет 'bearerToken', я хочу вывести ошибку. Так, чтобы в моей подписке это вошло в 2-й параметр (handleError) упомянутый ниже.

.subscribe(success, handleError)

Какие-либо предложения?

60
задан 4 April 2017 в 09:17

2 ответа

Если Вы чувствуете себя подобно throw new Error(), кажется un-observable-like, который можно использовать switchMap:

// RxJS 6+ syntax
this.httpPost.pipe(switchMap(res => { 
   if (res.bearerToken) {
      return of(this.saveJwt(res.bearerToken)); 
   } 
   else {
      return throwError('Valid token not returned');
   }
});

или более кратко:

this.httpPost.pipe(switchMap(res => (res.bearerToken) ? 
                                    of(this.saveJwt(res.bearerToken)) : 
                                    throwError('Valid token not returned')
));

поведение будет тем же, это - просто другой синтаксис.

Вы буквально говорите 'переключатель' от http заметного в канале к другому заметному, которое или просто 'переносит' выходное значение или новую заметную 'ошибку'.

не забывают помещать of, или Вы получите некоторые запутывающие сообщения об ошибках.

Также красота 'switchMap' состоит в том, что можно возвратить совершенно новую 'цепочку' команд, если бы Вы хотели к - для любой логики, то должен быть сделан с saveJwt.

7
ответ дан 1 November 2019 в 10:25

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

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

this.httpPost.pipe(
  tap(res => { 
    if (!res.bearerToken) {
      throw new Error('Valid token not returned');
    }
  }),
  map(res => this.saveJwt(res.bearerToken)),
);
0
ответ дан 1 November 2019 в 10:25

Другие вопросы по тегам:

Похожие вопросы: