如何在可观察的地图中抛出Error(rxjs6,ng6)

问题描述 投票:2回答:1

我的问题类似于这个qazxsw poi,但是我在rxjs 6的角度6,我猜所有都改变了;)

我想知道,我如何将一个observable映射中的Error-Object传播给订阅OnError Part。我总是在OnNext Part中。

这是我到目前为止:

在ng-component中,我可能有以下方法调用

How to throw error from RxJS map operator (angular)

被调用的服务方法如下:

[...]
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);

    });
[...]

最后问题:如何管理,管道“地图”中的“throwError”被传播到订阅“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;
}

我最后在订阅OnNext Part与throwError({..})

如果我使用:

r = undefined

我也最终订阅了OnNext Part,其中return throwError({..}) 是throwError-Observable

Thx提前最好的问候

error-handling observable angular6 rxjs6
1个回答
1
投票

r将返回一个可观察的,当订阅时,将影响throwError({'msg' : 'MAP ERROR OCCURED'})通知。也就是说,它将调用订户的error方法。

在您的代码段中,您可以调用error并忽略该值。或者从传递给throwError运算符的项目函数返回其返回值。

两者都不会影响错误。

在第一种情况下没有订户,因为忽略了返回值。并且,在第二种情况下,没有订阅者,因为map运算符不订阅从项目函数接收的内容 - map运算符的项目函数可以返回任何内容;它不必返回一个可观察的。

要在map中抛出错误,请使用:

map
© www.soinside.com 2019 - 2024. All rights reserved.