如何在 observable 映射中抛出错误(rxjs 6,ng6)
How to throwError within map of observable (rxjs6, ng6)
我的问题与这个问题类似 ,但我在 angular6 和 rxjs6 上,我想一切都变了 ;)
我想知道如何将可观察对象的映射内的错误对象传播到订阅的 OnError 部分。我总是在 OnNext 部分结束。
这是我目前的情况:
在 ng-component 中,我可能有以下方法调用
[...]
this.dataStreamService.execCall({ method : 'order_list',params : {}})
.subscribe( r => {
// here r provides the result data from http call
console.log("execCall result", r);
}, err => {
// HERE the "MAP ERROR OCCURED" Error should be occured as well,
// but in doesn't
console.log("execCall error",err);
});
[...]
调用的服务方法如下所示:
execCall(dataStreamCall: DataStreamCall): Observable<DataStreamResult> {
let apiURL = '<some API-URL>';
let params = dataStreamCall.params;
// do HTTP request (this.http calls an extra service handler which wraps
// the angular httpClient and the API errors there
// There is NO Problem with that part :)
let apiResult = this.http.post(apiURL, params);
// Build a new Observable from type "DataStreamResult"
let dsr : Observable<DataStreamResult> = apiResult
.pipe(
map( httpresult => {
if (httpresult['status'] == false){
// the http call was basically successful,
// but state in data is false
// *** THIS IS NOT PROPAGATE TO SUBSCRIBE OnERROR ***
throwError({'msg' : 'MAP ERROR OCCURED'});
// also tried as alternative
return throwError({'msg' : 'MAP ERROR OCCURED'});
} else {
// here the http call was successful
let d = new DataStreamResult();
d.result = httpresult;
return d;
}
}),
catchError( err => {
// error is bubble up from http request handler
return throwError(err);
})
);
return dsr;
}
最后是问题:
如何管理,将管道 "map" 中的 "throwError" 传播到订阅 "err => { ... }".
以下的实际行为:
throwError({..})
我最终以 r = undefined
订阅了 OnNext 部分
如果我使用:
return throwError({..})
我也结束了订阅 OnNext 部分,其中 r
是 throwError-Observable
提前致谢
最好的问候
throwError({'msg' : 'MAP ERROR OCCURED'})
将 return 一个 observable,订阅后会产生 error
通知。也就是说,它将调用订阅者的 error
方法。
在您的代码段中,您可以调用 throwError
并忽略该值。或者您 return 它的 return 值来自传递给 map
运算符的项目函数。
两者都不会产生错误。
第一种情况没有订阅者,因为return值被忽略了。并且,在第二种情况下,没有订阅者,因为 map
运算符不订阅它从项目函数接收的内容——map
运算符的项目函数可以 return 任何东西;它不必 return 一个可观察的。
要在 map
内抛出错误,请使用:
throw {'msg' : 'MAP ERROR OCCURED'};
我的问题与这个问题类似
我想知道如何将可观察对象的映射内的错误对象传播到订阅的 OnError 部分。我总是在 OnNext 部分结束。
这是我目前的情况:
在 ng-component 中,我可能有以下方法调用
[...]
this.dataStreamService.execCall({ method : 'order_list',params : {}})
.subscribe( r => {
// here r provides the result data from http call
console.log("execCall result", r);
}, err => {
// HERE the "MAP ERROR OCCURED" Error should be occured as well,
// but in doesn't
console.log("execCall error",err);
});
[...]
调用的服务方法如下所示:
execCall(dataStreamCall: DataStreamCall): Observable<DataStreamResult> {
let apiURL = '<some API-URL>';
let params = dataStreamCall.params;
// do HTTP request (this.http calls an extra service handler which wraps
// the angular httpClient and the API errors there
// There is NO Problem with that part :)
let apiResult = this.http.post(apiURL, params);
// Build a new Observable from type "DataStreamResult"
let dsr : Observable<DataStreamResult> = apiResult
.pipe(
map( httpresult => {
if (httpresult['status'] == false){
// the http call was basically successful,
// but state in data is false
// *** THIS IS NOT PROPAGATE TO SUBSCRIBE OnERROR ***
throwError({'msg' : 'MAP ERROR OCCURED'});
// also tried as alternative
return throwError({'msg' : 'MAP ERROR OCCURED'});
} else {
// here the http call was successful
let d = new DataStreamResult();
d.result = httpresult;
return d;
}
}),
catchError( err => {
// error is bubble up from http request handler
return throwError(err);
})
);
return dsr;
}
最后是问题: 如何管理,将管道 "map" 中的 "throwError" 传播到订阅 "err => { ... }".
以下的实际行为:
throwError({..})
我最终以 r = undefined
如果我使用:
return throwError({..})
我也结束了订阅 OnNext 部分,其中 r
是 throwError-Observable
提前致谢 最好的问候
throwError({'msg' : 'MAP ERROR OCCURED'})
将 return 一个 observable,订阅后会产生 error
通知。也就是说,它将调用订阅者的 error
方法。
在您的代码段中,您可以调用 throwError
并忽略该值。或者您 return 它的 return 值来自传递给 map
运算符的项目函数。
两者都不会产生错误。
第一种情况没有订阅者,因为return值被忽略了。并且,在第二种情况下,没有订阅者,因为 map
运算符不订阅它从项目函数接收的内容——map
运算符的项目函数可以 return 任何东西;它不必 return 一个可观察的。
要在 map
内抛出错误,请使用:
throw {'msg' : 'MAP ERROR OCCURED'};