- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
与其他“FRP”库不同,Rx 不会防止故障:使用时间不匹配的数据调用的回调。有解决此问题的好方法吗?
举个例子,假设我们有一系列从单个流派生的昂贵计算(例如,我们在下面进行排序或 ajax 获取,而不是 _.identity)。我们执行 distinctUntilChanged 以避免重新计算昂贵的东西。
sub = new Rx.Subject();
a = sub.distinctUntilChanged().share();
b = a.select(_.identity).distinctUntilChanged().share();
c = b.select(_.identity).distinctUntilChanged();
d = Rx.Observable.combineLatest(a, b, c, function () { return _.toArray(arguments); });
d.subscribe(console.log.bind(console));
sub.onNext('a');
sub.onNext('b');
第二个事件最终会导致一些故障状态:我们输出了三个事件,而不是一个,这会浪费大量 CPU,并且需要我们明确地解决不匹配的数据。
可以通过删除 distinctUntilChanged 并编写一些古怪的 scan() 函数来绕过这个特定示例,以在输入未更改的情况下传递先前的结果。然后您可以压缩结果,而不是使用 combineLatest。这很笨拙,但可行。
但是,如果任何地方都存在异步,例如ajax 调用,然后 zip 不起作用:ajax 调用将同步(如果缓存)或异步完成,因此您不能使用 zip。
编辑
尝试用一个更简单的例子来阐明期望的行为:
您有两个流,a 和 b。 b 取决于 a。 b 是异步的,但浏览器可能会缓存它,因此它可以独立于 a 更新,也可以与 a 同时更新。因此,浏览器中的特定事件可能会导致以下三种情况之一:更新; b 更新; a 和 b 都更新。所需的行为是在所有三种情况下只调用一次回调(例如渲染方法)。
zip 不起作用,因为当 a 或 b 单独触发时,我们不会从 zip 获得任何回调。 combineLatest 不起作用,因为当 a 和 b 一起触发时,我们会得到两个回调。
最佳答案
概念
both a and b update
a
和 b
都是可观察的,在 Rx 中不作为原语存在。
没有可以定义的无损通用运算符来决定何时从 a
收到通知,是应该将通知传递到下游还是推迟到收到来自 b< 的通知
。 Rx 中的通知本身不携带“两者”语义,或任何超出 Rx 语法的语义。
此外,Rx 的串行合约会阻止运算符(operator)利用重叠通知来实现此目标。 (尽管我怀疑依赖竞争条件并不是您想要的方法。)
参见 Rx Design Guidelines 中的 §§4.2、6.7 .
因此,我上面所说的“没有可以定义的无损通用运算符……”的意思是给定两个具有独立的可观察量 a
和 b
通知,任何试图决定何时从 a
或 b
收到通知的运算符(operator)是必须立即推送还是等待“其他”值,必须依赖任意时间.这是猜测。因此,这个假设的运算符必须要么丢弃值(例如,DistinctUntilChanged
或 Throttle
),要么丢弃时间(例如,Zip
或 Buffer
),尽管可能是两者的某种组合。
因此,如果代理有能力单独推送a
,或者单独推送b
,或者a
和b
一起作为通知单元,那么开发人员有责任自己具体化通知单元的概念。
需要三态类型:a |乙 | {a,b}
(请原谅我糟糕的 JS)
var ab = function(a, b) { this.a = a; this.b = b; }
sub.onNext(new ab('a')); // process a alone
sub.onNext(new ab('a', 'b')); // process a and b together
sub.onNext(new ab(null, 'c')); // process c alone
observable 查询的形状不再重要。观察者必须被定义为接受这种数据类型。生成器有责任根据其内部状态的语义应用任何必要的缓冲或计时计算,以便为其观察者生成正确通知。
顺便说一下,感谢您在您的编辑中提供了一个简单的解释(反正我觉得很清楚)。我第一次听说“故障”是在 this Rx forum discussion 中.如您所见,它从未真正结束。现在我想知道 OP 的问题是否真的这么简单,当然假设我已经正确理解了你的问题。 :-)
更新:
这是另一个相关的讨论,包括我对为什么 Rx 不是 FRP 的更多想法:
关于javascript - 如何避免 Rx 中的故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332407/
我用 Cocoapods 创建了一个简单的项目并安装了 RxSwift 和 RxCocoa。 我写了这段代码: import UIKit import RxSwift class ViewContro
我对 Rx 真的很陌生,只是想知道 subscribeOn 的顺序如何影响 Observable //This will not print anything Observable.just("wha
我有一个 PublishSubject 每 X 秒发出一个信号,我想只考虑 Y 秒后发出的第一个项目。 例子 observable A 每秒发出一次“滴答声” observable B 应该每 5 秒
我有以下流。 Observable.just(Unit) // execute immediately .mergeWith(tryAgainRelay) // execute again w
我可以看到 RX 适用于 Android 和 UI 事件处理。我很难看到 RX 在后端提供了什么好处。 RX Java 是为后端处理而设计的,还是这个概念太过分了? 最佳答案 实际上,RxJava 最
我有一个关于什么是更好的 RxJava 模式以保持可观察状态的问题。 为简单起见,假设我们有一个 StateManager需要跟踪系统中某个状态(假设它是一个简单的 bool 标志)并以可观察的方式公
我遇到了以下问题。我有一个从具有 isMember 属性的服务器请求的基本对象。如果该属性为 true,我想向端点 1、2 和 3 发出请求。 如果该属性为 false,我只想向端点 1 发出请求。
我正在使用 RxJava,但也许能够翻译另一个实现的答案。 我有一个 Observable 发出一系列项目,我想将它们分成 10 组。如下所示: observable .buffer(10)
有没有办法计算 RxAndroid 中流中已处理的元素数量? 我有类似的事情: Observable.fromArray(new String[]{"these", "are", "my", "val
如果我的客户端断开连接(错误)超过 10 秒,我会尝试显示一个弹出窗口。但是,当重新连接时,我也会关闭弹出窗口(true)。如果为真,我需要立即关闭弹出窗口。 我认为我需要做的是根据值(假)进行去抖,
收到 onNext() 后如何自动退订? 现在我使用这个代码: rxObservable .compose(bindToLifecycle()) // unsubscribe automaticall
我在 Ettus x310 上有一个简单的 C++ 测试程序,以前可以用,但现在不行了。我试图简单地设置单个 USRP 的两个 channel 的两个中心频率。当我尝试在第二个 channel 上设置
我有一个返回 Observable 的网络调用,我有另一个网络调用,它不是依赖于第一个 Observable 的 rx,我需要以某种方式转换这一切都与 Rx 相关。 Observable respon
我正在尝试根据 Rxjava 中的某些条件创建组列表。 以下是我的回复: { "dates":[ { "date":18, "value":
RX 6800 XT是最近很强的一款显卡,让很多的用户都很喜爱,详细还有很多没有入手的用户对他不是很了解吧,下面就带来了RX 6800 XT评测、跑分、价格、参数、图片,快来一起看看吧。 RX
我有一个重复元素列表,比如: Observable source = Observable.just("A", "B", "A", "C", "C", "A"); 我想按它们的值以及它们出现的次数对它
如果我将 RX-main 包添加到 WPF 应用程序,我会安装以下依赖包: 接收接口(interface) 接收核心 Rx-Linq Rx 平台服务 主要接收 添加 Rx-main 后,可以安装两个与
com.myapp.test.debug E/MessageQueue-JNI:rx.exceptions.OnErrorNotImplementedException 在 rx.Observable
这个问题在这里已经有了答案: RxJava operator that emits if different from last (1 个回答) 关闭 5 年前。 我有一个 bool 型 Obser
首先,我在两个 shell 中同时运行 vnstat -tr -i eth0 和 iftop。奇怪的是,vnstat 中的 rx 比 iftop 中的峰值 rx 大得多。我该如何解决这个问题? vns
我是一名优秀的程序员,十分优秀!