Debugging 如何调试rxjs5?

Debugging 如何调试rxjs5?,debugging,rxjs5,redux-saga,redux-observable,Debugging,Rxjs5,Redux Saga,Redux Observable,在上一篇文章中,我读到他们的目标是更好的可调试性: 目标 提供比之前版本的RxJS更多的可调试调用堆栈 我刚刚开始使用redux-observable,这与redux-saga相比,我更容易理解,因为我已经习惯了lodash和ramda的被动风格(好吧,可能是fp风格;)。我很惊讶现在还不能调试它。这是真的吗?如果是这样的话,那么我必须切换到redux sagas或者坚持使用redux thunk 根据杰伊·菲尔普斯的答案进行编辑 通过调试,我的意思是:“如何在浏览器中设置断点,例如,obser

在上一篇文章中,我读到他们的目标是更好的可调试性:

目标

提供比之前版本的RxJS更多的可调试调用堆栈


我刚刚开始使用
redux-observable
,这与
redux-saga
相比,我更容易理解,因为我已经习惯了
lodash
ramda
的被动风格(好吧,可能是fp风格;)。我很惊讶现在还不能调试它。这是真的吗?如果是这样的话,那么我必须切换到
redux saga
s或者坚持使用
redux thunk

根据杰伊·菲尔普斯的答案进行编辑


通过调试,我的意思是:“如何在浏览器中设置断点,例如,
observable.map(…)
”,使用
lodash
,我可以在浏览器中设置断点,它就停在
的.map(…)
上。如何使用
redux-observable
(或
rxjs
)执行此操作?我不想依赖于大理石图的绘制和
console.log()。我认为可以肯定地说,如果不是这样的话,几乎没有人会使用它——Angular2也在它的基础上大量构建

人们最常用的方法是调试其他JavaScript、断点(例如调试器)和console.log()的相同方法

有些用户使用更高级的技术,如绘制依赖关系图或大理石图。最近,所以这可能是一个有用的资源

最终,任何类型的异步编程都将更难调试。这不是redux observable/RxJS所独有的;快速搜索也会发现许多关于redux传奇的调试问题

事实证明,对于绝大多数构建的应用程序来说,redux thunk是最好的解决方案,因为大多数应用程序都没有复杂的副作用问题,这些问题可以证明redux observable或redux saga之类的东西是合理的。尽管如果您已经精通RxJS,使用redux observable并没有什么错

redux传奇作为一个项目存在的时间比redux可观察的时间要长,所以这当然是一个主要卖点。您将发现更多的文档、示例,并且可能有更好的社区可以从中获得支持

相反,你在redux传奇中学习到的操作符和API远不如学习RxJS那样可移植,RxJS到处都在使用。redux observable在内部非常简单,它为您提供了一种使用RxJS的自然方式。所以,如果你知道RxJS(或想知道),这是一种非常自然的搭配

目前我对大多数人的建议是,如果你不得不问你应该使用哪一种,你可能应该选择redux saga

(免责声明:我是redux observable和RxJS v5的维护者之一)

.do(debugValue=>console.log(debugValue))


“现在还不可能调试它”你是什么意思?RxJS v5的调用堆栈更加精确(目标也是如此)。您当然可以调试RxJS代码。每个使用它的人都会调试它。没有人会使用无法调试的东西。谢谢你给我一个详尽的答案。我更新了这个问题,使之更加准确。谢谢你的详尽回答。我更新了问题,使之更加准确。我还看到,由于使用了
rx
,与
redux saga
相比,
redux observable
在其他项目上更易于重用。查看这篇关于rxjs调试的文章——实际上,没有办法使用断点对其进行调试。所以我会接受这个答案。@zatziky那篇文章(以及该回购协议)是针对RxJS v4的,而不是v5。这是v5编写的主要原因之一,以解决这个问题。此外,它的内部提升机制将使一些非常惊人的开发工具成为可能,但这些工具尚未编写,因为我们仍在完成第一个主要的v5版本。RxJS v5 repo在这里:,这里的文档是一个很好的示例,但需要解释以避免否决票
import Rx, { Observable } from 'rxjs'

const arrStream$ = Observable.of(1,2,3)
                    .do(x=>console.log('Before',x))  // 1, 2, 3
                    .map(x=>x*2)
                    .do(x=>console.log('After',x))   // 2, 4, 6
                    .subscribe(value=>doThingsWith(value))
// real console output
// Before 1
// After  2
// doThingsWith(2)
// Before 2
// After  4
// doThingsWith(4)
// Before 3
// After  6
// doThingsWith(6)