Я хочу, чтобы бросить ошибка с моей наблюдаемых'ы карта оператор в зависимости от условия. Например, если правильные данные 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.") );
}
В основном, как вы можете видеть в коде, если ответ (объекта ВИЭ) не'т 'bearerToken' я хочу, чтобы бросить ошибка. Так что в моей подписке он переходит в 2-й параметр (handleerror с), указанных ниже.
.subscribe(success, handleError)
Какие-либо предложения?
Просто бросить ошибку в карте () оператора. Все обратные вызовы в RxJS обернут в блок try-catch блоки, поэтому он'll быть пойманным, а затем отправлены как "ошибка" уведомления.
Это означает, что вы Дон'т ничего возвращать, а просто бросать ошибка:
map(res => {
if (res.bearerToken) {
return this.saveJwt(res.bearerToken);
} else {
throw new Error('Valid token not returned');
}
})
В throwError()
(бывший наблюдаема.бросок () в RxJS 5) является наблюдаемой, что как раз отправляет сообщения уведомления, но карты()
не'т волнует, что вы вернетесь. Даже если вы вернетесь заметный из карты()` это'll быть передан как "далее" уведомление.
Последняя вещь, вы, вероятно, Дон'т должны использовать .catchError()
(бывший поймать () в RxJS 5). Если вам необходимо выполнить какие-либо побочные эффекты, когда происходит ошибка, он'ы лучше использовать кран(нуль, ошибаться => консоли.журнал(подстраховаться))
(бывший у()
в RxJS 5) например.
Января 2019: обновлено для RxJS 6
Если вы чувствуете, как бросить новый ошибка (), кажется, ООН-наблюдаемые, как вы можете использовать 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')
));
Поведение будет то же самое, это's просто другой синтаксис.
Вы'вновь говоришь, 'переключателя' от HTTP наблюдаемые в трубу другой наблюдаемой, которая либо просто 'упаковка' выходное значение, или новый 'ошибка' наблюдаема.
Дон'т забудьте поставить О
или вы'будете получать различные сообщения об ошибке.
Также Красота 'switchMap' что вы можете вернуться совершенно новый 'сеть' команд если ты хочешь - по любой логике должно быть сделано с saveJwt
.
Хотя этот вопрос уже ответили, Я'd, как поделиться мой собственный подход (хотя и незначительно отличается от указанного выше).
Я бы решить, что возвращается отдельно от карт и наоборот. Я'м не знаете, какой оператор лучше для этого, поэтому я'будете использовать "кран".
this.httpPost.pipe(
tap(res => {
if (!res.bearerToken) {
throw new Error('Valid token not returned');
}
}),
map(res => this.saveJwt(res.bearerToken)),
);