如何调试ngrx/store?

6
我遇到了一个与 Angular 2 和 ngrx/store 相关的特定代码状态,我的应用程序完全崩溃了(路由不工作,数据不出现,路由回到上一个页面,以及所有其他可能的灾难),但我已经没有办法调试存储器周围发生的事情了。Redux dev-tools 是一个很好的工具,但似乎无法捕捉错误。
我在我的选择器、效果和 .subscribe() 语句之前放置了.catch语句,尝试了两种变体:
return state$.select(state => state.user)
  .map(user => user.collection)
  .catch((error, caught) => {
      console.log('error getCollection');
      return caught;
  });

并且

return state$.select(state => state.user)
  .map(user => user.collection)
  .catch((error) => {
      console.log('error getCollection');
      return Observable.throw(error);
  });

控制台保持沉默。我不相信会有任何其他的“单一错误源”,除了存储器。

这段代码对我来说没有捕获错误。它应该吗?:

.do(() => {
    Observable.throw('fake error');
})
.catch(error => {
    console.error(error);
    return Observable.throw(error);
});

有人能指导我如何调试存储中使用的可观察对象吗?

1个回答

2

使用.do()记录一个流 - 这将修复它。

您需要通过RXJS导入添加do运算符。

return state$
  .do(() => { // log here } )
  .select(state => state.user)
  .map(user => user.collection)
  .catch((error, caught) => {
      console.log('error getCollection');
      return caught;
  });

但是,它如何向我提供有关错误事件的信息,因为它将无条件记录? - user776686
它正在记录从流中发出的内容。 - danday74
你也可以使用.map.do来查看map正在做什么等。 - danday74
谢谢你的建议,但这个想法基本上是重复了我在Chrome浏览器的ngrx/store-devtools Redux选项卡中看到的一切。我真的很想知道catch方法有什么问题。这段代码没有捕捉到错误。应该加上吗?.do(() => { Observable.throw('fake error'); }) .catch(error => { console.error(error); return Observable.throw(error); }); - user776686
您的订阅包含三个函数。第一个是NEXT,第二个是ERROR,第三个是COMPLETE。 如果返回Observable.throw,则会结束流并调用ERROR块。 如果这不是您想要的,请返回Observable.from(['somethingToEmitToNextFunction'])以防止流停止并调用NEXT函数。 或者从catch块中返回Observable.empty()以什么都不做(将停止流)。 您可以尝试其他返回值...请参见https://github.com/ReactiveX/RxJava/wiki/Creating-Observables - danday74

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接