Bacon.js BaconJS中onValue和doAction有什么不同?
Bacon.js BaconJS中onValue和doAction有什么不同?,bacon.js,Bacon.js,onValue“将给定的处理程序函数订阅到事件流。流中的每个新值都将调用该函数。[这]是为流分配副作用的最简单方法。” 另一方面,doAction“返回一个流/属性,在该流/属性中,函数f在分派给订阅者之前针对每个值执行。” 听起来这两个函数都只是对流中的每个值执行一个函数。它们之间有什么不同?不同之处在于doAction返回相同的流,允许您链接副作用,而onValue是一个类似订阅的函数(因此返回一个取消订阅函数) [我本打算真的问这个问题,然后在我开始写下它的时候意识到了答案。如果其他人发现
onValue
“将给定的处理程序函数订阅到事件流。流中的每个新值都将调用该函数。[这]是为流分配副作用的最简单方法。”
另一方面,doAction
“返回一个流/属性,在该流/属性中,函数f在分派给订阅者之前针对每个值执行。”
听起来这两个函数都只是对流中的每个值执行一个函数。它们之间有什么不同?不同之处在于
doAction
返回相同的流,允许您链接副作用,而onValue
是一个类似订阅的函数(因此返回一个取消订阅函数)
[我本打算真的问这个问题,然后在我开始写下它的时候意识到了答案。如果其他人发现自己处于类似的情况,也许这会节省他们几分钟的时间。]最大的区别是
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)
实现异步)