Asynchronous 比较core.async和函数式反应式编程(+;Rx)
当将Clojure的core.async与所谓的反应式扩展(Rx)和FRP进行比较时,我似乎有点困惑。它们似乎解决了类似的异步性问题,所以我想知道主要的区别是什么,在什么情况下,一个优于另一个。有人能解释一下吗 编辑:为了鼓励更深入的回答,我想让问题更具体:Asynchronous 比较core.async和函数式反应式编程(+;Rx),asynchronous,clojure,reactive-programming,frp,core.async,Asynchronous,Clojure,Reactive Programming,Frp,Core.async,当将Clojure的core.async与所谓的反应式扩展(Rx)和FRP进行比较时,我似乎有点困惑。它们似乎解决了类似的异步性问题,所以我想知道主要的区别是什么,在什么情况下,一个优于另一个。有人能解释一下吗 编辑:为了鼓励更深入的回答,我想让问题更具体: async允许我编写同步代码。然而,据我所知,FRP只需要一级嵌套回调(所有处理逻辑的函数都作为参数传递给FRP API)。这两种方法似乎都不需要回调金字塔。的确,在JS中,我必须多次编写function(){…},但主要问题,即嵌套回调,
function(){…}
,但主要问题,即嵌套回调,也在FRP中消失了。我理解对了吗与FRP不同,FRP基本上仍然是关于回调的,它通过控制流完成消息的通信。async完全消除了代码中的回调,并将控制流与消息传输分离。此外,在FRP中,通道不是一级对象(即,不能将FRP通道作为FRP通道上的值发送)。编辑: 回答您的问题:
var obs=getJSON('story.json')。重试(3)代码>
var obs=Rx.Observable.fromEvent(文档“keyup”).distinctUntilChanged()代码>
为了让它更具体一点,将David Nolen文章中的代码与RxJS FRP示例进行比较,至少有一个主要区别,我认为,“[FRP]通过控制流完成消息通信”的丰富之处如下 回调是执行的代码。执行必须在某个线程的某个时间点发生。通常,时间是事件发生的时间,线程是通知/生成事件的线程。如果制作人将消息放在频道上,则您可以在需要的时候自由地使用消息,使用任何线程。因此回调,本质上是一种通信形式,通过指示何时何地执行回调代码,通过控制流完成通信。如果出于任何原因必须使用回调,只需使用回调将消息放在队列/通道上,您就回到了正轨
因为core.async不太复杂,所以只要没有很好的理由使用替代方案,就应该首选它。我认为主要问题是您对已解决问题的假设并不完全如此,因为它们都没有解决异步性“问题” 抽象
FRP
主要思想是变化的传播,请考虑完成Excel所做的相同工作,在级联中定义相互依赖的单元,当一个单元发生变化时,将重新计算级联上的所有依赖单元
<代码>核心。异步< /代码>主要是系统分解,在不同进程的中间使用“<代码>队列> /代码>作为关注点,在
这是
实现和APIRx
Rx
可用于对任何dat建模
var channel = new Rx.ReplaySubject();
// Send three observables down the chain to subscribe to
channel.onNext(Rx.Observable.timer(0, 250).map(function () { return 1; }));
channel.onNext(Rx.Observable.timer(0, 1000).map(function () { return 2; }));
channel.onNext(Rx.Observable.timer(0, 1500).map(function () { return 3; }));
// Now pass the channel around anywhere!
processChannel(channel);