如何在可观察的地图中抛出错误(rxjs 6,ng6)

Posted

技术标签:

【中文标题】如何在可观察的地图中抛出错误(rxjs 6,ng6)【英文标题】:How to throwError within map of observable (rxjs6, ng6) 【发布时间】:2019-02-04 10:39:03 【问题描述】:

我的问题与How to throw error from RxJS map operator (angular) 类似,但我在 angular6 和 rxjs6 上,我想一切都变了 ;)

我想知道,我如何将一个可观察对象映射中的错误对象传播到订阅 OnError 部分。我总是在 OnNext 部分结束。

这是我目前所拥有的:

在一个 ng 组件中,我可能有以下方法调用

[...]
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 Part

如果我使用:

return throwError(..)

我还订阅了 OnNext 部分,其中 r 是 throwError-Observable

提前谢谢 最好的问候

【问题讨论】:

【参考方案1】:

throwError('msg' : 'MAP ERROR OCCURED') 将返回一个 observable,当订阅它时,会产生一个 error 通知。即会调用订阅者的error方法。

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

两者都不会产生错误。

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

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

throw 'msg' : 'MAP ERROR OCCURED';

【讨论】:

感谢@cartant 你让我开心。现在我更好地理解了这件事,throw 声明只是做我想做的事:)

以上是关于如何在可观察的地图中抛出错误(rxjs 6,ng6)的主要内容,如果未能解决你的问题,请参考以下文章

在可管道 rxjs 运算符的组合管道中捕获错误

AngularJS / rxjs:订阅时观察不到错误

如何从 java servlet 中抛出 404 错误?

SwiftUI 组嵌套在 VStack 中抛出错误

如何在 Drupal 模块中抛出 404 错误?

如何追溯python3.7中抛出的错误?