javascript - Bacon.js 中的 3 个属性的 .when

标签 javascript node.js bacon.js

有没有更简单的方法来实现combine3

var Bacon = require('baconjs')

function emit(delay)
{
        var s = new Bacon.Bus()
        setTimeout(function ()
        {
                console.log("emit", delay)
                s.push(delay)
        }, delay)
        return s.toProperty()
}

var foo = emit(500)
var bar = emit(1000)
var baz = emit(1500)

function consume(foo, bar, baz)
{
        console.log("consumed", foo, bar, baz)
}

function combine3(consume, foo, bar, quux)
{
        Bacon.combineWith(function (foo, bar, quux)
        {
                return { foo : foo, bar : bar, quux : quux }
        }, foo, bar, quux)
        .onValue(function (x)
        {
                consume(x.foo, x.bar, x.quux)
        })
}

combine3(consume, foo, bar, baz)

请注意,除非存在虚拟 onValue() 消费者,否则 combineWith 单独不起作用:

Bacon.combineWith(consume, foo, bar, baz).onValue(function () {})

解决方法看起来仍然像黑客。以下 3 个版本不调用 consume():

Bacon.when([foo, bar, baz], consume)
Bacon.update(911, [foo, bar, baz], consume)
Bacon.zipWith(foo, bar, baz, consume)

当前的任务是根据 3 个参数过滤 HTML 表格。因此 consume 根据当前选择的过滤条件绘制表格,并且不会生成新的 Observables

还有,有没有更简单的方法来编写emit()

最佳答案

然后使用combineWith方法从现有的Observables(Properties和EventStreams)创建一个新的Property。所有 Observable 都是惰性的,即除非它们至少有一个订阅者,否则不会注册到底层源。

您不应该将 Observables 的组合(包括组合、压缩、何时、更新等)与分配副作用(即注册订阅者)混淆。如果您希望对 Observable 中的值调用“consume”函数,则需要将其注册为订阅者。

仍然存在 Bacon 事件仅携带一个值的问题,因此您不能将 N 元函数与 onValue 一起使用。不过,您可以使 Observable 包含数组作为值,并使用“onValues”方法将值数组拆分为 N 元函数的参数。

因此,实现此目的的一种方法是

// Property that emits values as arrays of [foo, bar, baz]
var combined = Bacon.combineAsArray(foo, bar, baz)
// Assign side effect. Split value arrays to 3-ary function.
combined.onValues(consume)

因为我发现您想要组合 N 个 Observables 并对值应用 N 元函数是很常见的情况,所以有一个速记方法“Bacon.onValues”用于此目的。所以,最简单的答案就是

Bacon.onValues(foo, bar, baz, consume)

关于javascript - Bacon.js 中的 3 个属性的 .when,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662448/

相关文章:

javascript - 类似 Photoshop、可嵌入的基于 Web 的图像编辑器?

javascript - 了解 Node.js/JavaScript 中什么是同步、什么是异步

node.js - 如何在 NodeJS 中使用 Apache Kafka 将记录添加到 MongoDb 中?

javascript - Bacon.js 属性新值和旧值

javascript - Meteorjs collection.find 不会从数据库返回特定数据

javascript - vue.js - 在我的项目中实现 Auth0 示例给我 _vm.login 不是一个函数(…)

javascript - 如何实现颜色选择器而不是静态颜色

node.js - Forever Node JS 启动或停止/启动

rxjs - 数组流转换为流运算符数组

javascript - Bacon.js 仅当 prop === true 时才将属性与 .and() 结合起来