【问题标题】:How do I catch an error at two different points in RxJS/Angular?如何在 RxJS/Angular 的两个不同点捕获错误?
【发布时间】:2017-08-13 04:03:11
【问题描述】:

假设这个 Angular 2 sn-p:

export class ApiService {
  // do stuff
  request(...): Observable<Response> {
    return this.http.request(...)
      .share()
      .catch((error: any) => {
        let errMsg = 'my error';
        // do more stuff...
        // tried: throw errMsg;
        // tried: return Observable.throw(errMsg);
      });
  }
}

然后:

api.request(...).catch(() => {
  console.log('caught');
  return Observable.from([]);
}).subscribe({
  console.log('everything fine');
});

当请求成功时,传递给subscribenext 回调确实会被正常调用,但传递给catch 的回调却没有。

我已经尝试在具有不同职责的代码的两个不同部分中处理错误。我希望ApiService.request 抛出的错误消息最终会出现在第二个回调中,这样我就可以进一步完善我对用户的响应。我试过throw errMsg 和返回Observable.throw(errMsg)

我将.share() 用于可观察对象的原因是我不希望 http 客户端为每个订阅者生成一个请求。

我哪里弄错了?

编辑:

我上面的例子并没有真正抓住我遇到的问题。这第二个 sn-p 允许复制它:

const a = Rx.Observable.create(function(observer){
  observer.error('h');
}).share().catch(err=> {
  console.error('first place',err);
  throw 'err'
})
.subscribe(() => null)
.subscribe(console.log, console.error);

第一个订阅者未能捕捉到错误(由于没有定义错误处理程序)并中断了到第二个订阅者的链。

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    据我了解,您想在两个地方发现错误。根据文档,您需要使用 throw 。我试过了,它对我来说很好用。这是代码 sn-p :

    const a = Rx.Observable.create(function(observer){
        observer.error('h');
    });
    
    a.catch(err=> {
       console.error('first place',err);
       throw 'err'
    }).subscribe(console.log,console.error);
    

    输出

    x first place 
    x err 
    

    JSBin : https://jsbin.com/jefalazibo/edit?html,js,console

    在组件代码中你不需要再写一个 catch 。 subscribe 接受三个函数作为参数

     subscribe(onSuccess, onError, onComplete);
    

    文档:https://github.com/ReactiveX/rxjs/blob/master/src/operator/catch.ts (检查示例 3)

    【讨论】:

    • 定义onError和第二次捕获的效果一样吗?
    • 第二次抓到没明白你的意思。它的作用是:当出现错误时,它不执行onSuccess 函数,而是执行onError 函数。这是正确的做法。如果我们想捕获异常并更改流中返回的内容,我们使用catch。通常在服务级别完成,而不是在组件中。
    • 当我们不使用subscribe,而是直接在HTML中使用async时,我们在组件中使用catch。那是不同的故事
    • 我的意思是问指定 onError 是否与指定 catch 函数具有相同的效果。我现在知道他们有不同的目的。按照你说的方法在这里似乎行不通...我会尝试找出不同之处并回复你。提前致谢!
    • 当然。如果它简单,您可以创建一个 plnkr 或 stackblitz,以便我可以帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多