【问题标题】:Emitting events with Bacon.js使用 Bacon.js 发出事件
【发布时间】:2015-06-12 16:23:29
【问题描述】:

我正在学习 Bacon.js,但我对应该如何发出事件感到非常困惑。

我在这里有一个 node.js 中事件的超级简单示例

var events = require('events')
var eventEmitter = new events.EventEmitter()

eventEmitter.on("add", function(data){
  console.log(data+1)
  return data+1
})

eventEmitter.emit('add', 5)
eventEmitter.emit('add', 3)

setTimeout(function(){
  eventEmitter.emit('add', 13)
}, 1000)

setTimeout(function(){
  eventEmitter.emit('add', 10)
}, 3000)

我找不到一个例子来说明如何使用 BaconJS 和 node 完成这样简单的事情。

我试过了:

var add = Bacon.fromEvent(eventEmitter, "add")

add.onValue(function(data){
  return data+1
})

add.map(5)
add.map(3)
add.map(13)
add.map(10)

【问题讨论】:

    标签: javascript node.js events frp bacon.js


    【解决方案1】:

    您需要Bacon Bus。您只需将数据推送到总线,而不是发出事件。

    如果您想使用 NodeJS 发射器,您的代码如下所示:

    var add = Bacon.fromEvent(eventEmitter, "add")
    
    // every time we get an event we add 1 to its' value
    add.map(function(data){
      return data+1
    }).onValue(function(data){
      console.log(data)
    })
    eventEmitter.emit('add',10)
    

    请注意,您必须将 .onValue 附加到 add.map() 的结果中。否则控制台将仅输出事件流中的原始值。 map 创建一个新的、修改后的流。

    如果您对地图的工作原理感到有些困惑,BaconJS Snake example 可能会很有用。

    【讨论】:

    • 您可以将现有活动转换为培根总线吗?
    • 你不需要。如果你想从 Bacon API 发出事件——忘记 EventEmitter 并使用 Bus.push 将事件发布到总线。如果你想处理来自现有 EventEmitter 的事件,你应该使用 eventEmitter.emit()。我会在我的回答中重写你的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多