BaconJS中的onValue和doAction有什么不同?

时间:2014-12-28 10:06:21

标签: bacon.js

onValue"将给定的处理函数订阅到事件流。将为流中的每个新值调用函数。 [它]是为流分配副作用的最简单方法。"

另一方面,doAction"返回一个流/属性,其中为每个值执行函数f,然后发送给订阅者。"

听起来这些只是对流中的每个值执行一个函数。他们之间有什么不同?

2 个答案:

答案 0 :(得分:5)

不同之处在于doAction返回相同的流,允许您链接副作用,而onValue是类似订阅的函数(因此返回取消订阅功能)。

[我曾打算真实地问这个问题,然后在我开始写下来时意识到答案。如果其他人发现自己处于类似的情况,也许这会节省他们几分钟。]

答案 1 :(得分:4)

最大的区别是onValue订阅了流,doAction没有订阅。如果没有订阅者,则doAction内的函数永远不会被调用。

var numbers1 = Bacon.fromArray([1,2,3])
numbers1.doAction(function(number) {
    alert("doAction Number " + number) // This never gets called
})


var numbers2 = Bacon.fromArray([1,2,3])
numbers2.onValue(function(number) {
    alert("onValue Number " + number) // This gets called
})

var numbersBoth = Bacon.fromArray([1,2,3])
numbersBoth
  .doAction(function(number) { console.log(number) }) // gets called
  .onValue(function(number) {
    // Do something with number
  })

实际上我只使用doAction进行调试。如果要将副作用拆分为单独的函数,可以添加多个onValue处理程序(同步流除外,但可以使用简单的.delay(0)进行异步处理)