【问题标题】:Handle Error in RxJs flatMap stream and continue processing处理 RxJs flatMap 流中的错误并继续处理
【发布时间】:2017-01-30 21:54:52
【问题描述】:

我在 Angular 2 应用程序中使用 RxJs 从 API 中并行获取多个页面的数据,并保存任何失败的请求以供将来重试。

为此,我想捕获由 flatMap-ing http get 请求(下面的代码)生成的错误,并继续进行进一步的流处理。如果出现错误,我当前的解决方案会导致流中断。

Rx.Observable.range(1, 5)
   .flatMap(pageNo => {
              params.set('page', ''+pageNo);
              return this.http.get(this.API_GET, params)
                        .catch( (err) => {
                                  //save request
                                  return Rx.Observable.throw(new Error('http failed')); 
                          });
    })
    .map((res) => res.json());  

假设在上面的示例中,第 2 页和第 3 页的 HTTP 请求失败。我想为这两个请求处理错误(保存失败的请求稍后重试)并让其他请求继续并映射到 json()。

我尝试使用 .onErrorResumeNext 代替 catch,但我无法完成这项工作。

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    在您的捕获中,不要返回Observable.throw,然后它应该根据需要继续流。

    如果您想将信息传播到外部流,您可以使用 return Observable.of("Error: Foo.Bar"); 例如。

    或在catch 中记录错误并返回Observable.empty() 以使外部流基本上忽略错误。

    换句话说,就是把这个链接起来:

    .catch(error => Rx.Observable.of(error));

    const stream$ = Rx.Observable.range(1, 5)
        .flatMap(num => {
          return simulateRest(num)
                 .catch(error => {
                     console.error(error);
                     return Rx.Observable.empty();
                 });
          });
                 
    stream$.subscribe(console.log);
    
    // mocking-fn for simulating an error
    function simulateRest(num) {
        if (num === 2) {
            return Rx.Observable.throw("Error for request: " + num);
        }
      
        return Rx.Observable.of("Result: " + num);
    }
    <script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

    【讨论】:

    • 我试过了,它似乎不起作用。仅为第一个失败的请求记录错误。
    • 您如何记录错误?在一个简单的订阅?
    • 不,我在上面提到的代码中记录了//save request 的错误
    • 我添加了一个示例代码,它是如何工作的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2011-08-22
    相关资源
    最近更新 更多