我想根据条件从我的observable的map运算符中抛出一个错误。例如,如果未收到正确的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’,我想抛出一个错误。所以在我的订阅中它会进入下面提到的第二个参数(handleError)。
.subscribe(success,handleError)
有什么建议么?
只需将错误抛出.map()运算符。 RxJS中的所有回调都包含try-catch块,因此它将被捕获,然后作为错误通知发送。
这意味着你不返回任何东西,只是抛出错误:
.map(res => { if (res.bearerToken) { return this.saveJwt(res.bearerToken); } else { throw new Error('Valid token not returned'); } })
Observable.throw()是一个只发送错误通知的Observable,但map()并不关心你返回的内容。即使你从map()返回一个Observable,它也将作为下一个信号传递。
最后,您可能不需要使用.catch()。如果您在发生错误时需要执行任何副作用,最好使用do(null,err => console.log(err))。