Asynchronous 比较core.async和函数式反应式编程(+;Rx)

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(){…},但主要问题,即嵌套回调,

当将Clojure的core.async与所谓的反应式扩展(Rx)和FRP进行比较时,我似乎有点困惑。它们似乎解决了类似的异步性问题,所以我想知道主要的区别是什么,在什么情况下,一个优于另一个。有人能解释一下吗

编辑:为了鼓励更深入的回答,我想让问题更具体:

  • async允许我编写同步代码。然而,据我所知,FRP只需要一级嵌套回调(所有处理逻辑的函数都作为参数传递给FRP API)。这两种方法似乎都不需要回调金字塔。的确,在JS中,我必须多次编写
    function(){…}
    ,但主要问题,即嵌套回调,也在FRP中消失了。我理解对了吗

  • FRP通过控制流完成信息沟通”您(某人)能给出更具体的解释吗

  • 我不能像通过通道一样通过FRP的可观察端点吗

  • 总的来说,我了解这两种方法的历史渊源,我在这两种方法中都尝试过一些教程。然而,我似乎被不明显的差异“麻痹”了。是否有一些代码的示例,其中一个代码很难编写,而另一个代码很容易使用?这其中的架构原因是什么?

    。基本概念是表示线程之间异步通信的通道

    我们的目标是能够编写正常的顺序代码块来访问通道以获取输入,并将其无缝地转换为状态机,为您完成转换


    与FRP不同,FRP基本上仍然是关于回调的,它通过控制流完成消息的通信。async完全消除了代码中的回调,并将控制流与消息传输分离。此外,在FRP中,通道不是一级对象(即,不能将FRP通道作为FRP通道上的值发送)。

    编辑:

    回答您的问题:

  • 是的,很多时候,回调都可以消除,例如,通过重试逻辑、distinctUntilChanged和许多其他事情,例如:

    var obs=getJSON('story.json')。重试(3)

    var obs=Rx.Observable.fromEvent(文档“keyup”).distinctUntilChanged()

  • 我不确定这指的是什么,让流量控制变得更复杂

  • 是的,您可以像传递通道一样传递对象,就像下面的对象一样

  • 例如,您可以在此处使用RxJS和以下命令实现类似通道的行为:


    为了让它更具体一点,将David Nolen文章中的代码与RxJS FRP示例进行比较,至少有一个主要区别,我认为,“[FRP]通过控制流完成消息通信”的丰富之处如下

    回调是执行的代码。执行必须在某个线程的某个时间点发生。通常,时间是事件发生的时间,线程是通知/生成事件的线程。如果制作人将消息放在频道上,则您可以在需要的时候自由地使用消息,使用任何线程。因此回调,本质上是一种通信形式,通过指示何时何地执行回调代码,通过控制流完成通信。如果出于任何原因必须使用回调,只需使用回调将消息放在队列/通道上,您就回到了正轨


    因为core.async不太复杂,所以只要没有很好的理由使用替代方案,就应该首选它。

    我认为主要问题是您对已解决问题的假设并不完全如此,因为它们都没有解决异步性“问题”

    抽象
    FRP
    主要思想是变化的传播,请考虑完成Excel所做的相同工作,在级联中定义相互依赖的单元,当一个单元发生变化时,将重新计算级联上的所有依赖单元

    <代码>核心。异步< /代码>主要是系统分解,在不同进程的中间使用“<代码>队列> /代码>作为关注点,在Cyr.Acsic < /Calp>实例中,而不是队列中有通道,但您得到了这个想法。

    因此,删除金字塔代码不是这两种技术的目标,它们在不同的抽象层上运行

    关于完善控制流程 完整的通信和流量控制的思想来源于

    虽然有各种机制可以使事件/回调更干净(FRP、Rx/Observables),但它们不会改变它们的基本性质,即在事件发生时,可能会在同一线程上运行任意数量的其他代码,从而导致诸如“不要在处理程序中做太多工作”和“回调地狱”之类的警告

    换言之,如果您在事件处理程序中有业务域代码,那么您已经完成了X事件处理,以及当X发生时要做什么

    这是Cype。Assic 实施 所有关于回调和作为参数传递可观察端点的问题都只是实现问题,它实际上取决于

    Rx
    实现和API

    如果你看你真的没有太多的回调地狱被看到,你得到了传递观测值的想法

    最后的想法 即使
    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);