onValue
"将给定的处理函数订阅到事件流。将为流中的每个新值调用函数。 [它]是为流分配副作用的最简单方法。"
另一方面,doAction
"返回一个流/属性,其中为每个值执行函数f,然后发送给订阅者。"
听起来这些只是对流中的每个值执行一个函数。他们之间有什么不同?
答案 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)
进行异步处理)