Fab*_*oli 1 reactive-programming cyclejs xstream-js
该应用程序使用xstream作为反应库。
我陷入了一种奇怪的行为。
我的流就是这个图
在第一个会话var更新中,我得到了以下调试结果:
问题:未执行“调试2”分支
如果我更新会话项(以便产生新的存储事件),则两个分支均按预期执行
如果在“ debug 0”处添加.remember(),也会发生相同的良好行为。

没有过滤器(并且不记得),流程从第一个事件开始就给出此结果
我的怀疑是在连接第二个分支之前在“调试0”处观察到某种情况,因此第一个事件已被使用。但是,如果两个分支xs.merged在一起怎么办?如何执行一个分支而不执行第二个分支?这两个分支没有过滤器或其他处理,它们合并映射到化简函数。关于如何调试和解决这种情况的任何建议?
之所以storage.session.getItem会出现问题,是因为它在订阅后立即发出,并在merge(a$, b$)订阅a$之前先进行订阅b$,因此a$得到了事件,但是在b$订阅时,它来不及了。这个问题是众所周知的,并称为毛刺(在反应式编程中),通常在存在菱形流图时会发生,这正是您的情况。
我有两篇有关故障的博客文章,它们可以为您提供更多的背景信息:RxJS调度程序上的入门和Rx故障实际上不是问题。它提到了RxJS,但是xstream在实现方面与RxJS非常接近。xstream和RxJS之间的区别在于,xstream流始终是多播(“共享”)的,并且RxJS具有许多调度程序类型,但是xstream只有一种。RxJS中的默认调度程序与xstream具有相同的行为。
解决方案是.remember()在到达钻石之前应用。这是因为所发出的值需要为该流的其他使用者缓存。.remember()只需将Stream转换为MemoryStream。我认为源流最初是一个MemoryStream,并且映射一个MemoryStream会创建其他MemoryStreams,但是它filter是一个破坏了它的运算符。filter总是返回一个Stream,其原因是MemoryStreams应该始终具有当前值,但是filter可以删除值,因此过滤后的流可能没有任何当前值。
作为Cycle.js的作者,我认为cyclejs / storage的设计方法不是最好的,我认为我们将找到设计这些API的方法,以最大程度地减少与MemoryStream和Stream的混淆。但是暂时,重要的是要了解这两者之间的区别,并计划应用程序,从而避免出现菱形(和毛刺)或.remember()在正确的位置使用。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |