0

有没有更简单的实现方法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)

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

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()

4

1 回答 1

3

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

您不应该将 Observables 的组合(与 combine、zip、when、update 等)混淆为分配副作用,即注册订阅者。如果您希望对 Observable 中的值调用“消费”函数,则需要将其注册为订阅者。

尽管如此,培根事件仍然存在一个问题,因此您不能将 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)
于 2013-09-07T12:55:39.807 回答