F#中Reactive Extension触发值的实现:是否为Rx API设计的唯一途径?
在Rx框架中,触发Observable值的唯一方式是使用Subject的OnNext吗?
我在F#中实现了如下FRP代码,运行符合预期:
let print = fun a -> printf "%A\n" a let event = new Event<_>() let stream = event.Publish stream |> Observable.add (fun event -> event |> print) event.Trigger 5
尽管我不太喜欢event.Publish机制,但event.Trigger的逻辑还算直观。
现在我尝试使用Rx框架。我从测试版阶段就了解Rx,但认为它的observable/observer/subject等规则过于复杂,违背KISS原则,因此一直未使用。
奇怪的是,我始终找不到Rx中对应event.Trigger的实现方式。我搜索后找到RxJS的相关示例:
var eventStream = new Rx.Subject(); var subscription = eventStream.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); }); var my_function = function() { eventStream.next('foo'); }
经过多次尝试,我偶然发现以下F#代码可以正常运行:
let stream2 = 7 |> Subject.behavior stream2 |> Observable.map id |> Observable.subscribe print |> ignore stream2.OnNext 99
但由于官方文档未提及相关内容,仅外部文档有说明,这只是我的猜测。
我的问题是:基于Rx的API设计,这是否是触发值的唯一方式?
内容的提问来源于stack exchange,提问作者SmoothTraderKen
相关产品推荐
相关产品推荐

