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