【问题标题】:Dynamic rerouting and circular dependency with MostjsMostjs 的动态重路由和循环依赖
【发布时间】:2017-07-11 13:32:28
【问题描述】:

很明显,xstream 使用addListenerremoveListener 这两种方法能够动态地重新路由流(更改它们的源和接收器)。我看不到 mostjs 的等价物。大多数只让您布置一次流的路由吗?如果是这样,这种静态特性是否允许大多数 js 优化以获得如此卓越的性能?

此外,xstream 使用imitate 方法,使其具有循环依赖关系。有什么办法可以用mostjs实现循环依赖?

【问题讨论】:

    标签: xstream-js mostjs


    【解决方案1】:

    most.js 中有许多函数同时作用于SourceSink,例如map(),它转换流中的所有事件,通过消费事件充当Sink,并作为Source 在对它们应用函数后生成新事件值时。 observe() 是特定类型的 Sink 的一个示例,它使用事件并将它们传递给您提供的函数。

    大多数.js Streams 在您使用“终端”组合符observedrainreduce 之一之前不会处于活动状态。当您调用其中一个时,StreamSource-Sink 链中的信号发送到链最开头的Source。然后那个生产者Source 将开始生产事件。

    然后通过简单的方法调用从SourceSource-Sink 链同步传播事件。

    因此,您可以向map 提供您自己的“监听器”函数,该函数将转换事件。

    影响 most.js 性能的因素有很多。

    简单的调用栈事件传播架构,加上提升 try/catch out of combinator 实现是最早的两个 和最大的性能改进。

    Most.js 会自动执行其他几个优化,基于 代数等价。一个比较知名的例子是结合 多个map 操作,例如map(g, map(f, stream)),成 通过对fg 进行函数组合,单个map

    该操作还结合了多个filter操作,多个 merge 操作,多个 takeskip 等等。这些 优化减少了传播所需的方法调用的数量 从生产者到消费者的事件。

    See this interview with Brian Cavalier

    Most.js 本身不处理循环依赖,但使用most-proxy 完全可以。 Motorcycle 这样做是为了在其 run 包中创建其循环。

    【讨论】:

      【解决方案2】:

      您是否在most.jsxstream.jsimitate 中看到过这个问题?https://github.com/cujojs/most/issues/308

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-05
        • 2015-02-26
        • 1970-01-01
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多