反应式编程的初学者问题

时间:2015-04-12 12:48:18

标签: javascript reactive-programming bacon.js

我使用Kefir.js进行反应式编程,但我遇到了一些麻烦。我有一个带有N个传感器的设备(温度,压力,时间......),我认为如果我将传感器表示为流,那将是个好主意。所以我最终得到了这段代码:

function temperatureSensor(pin) {
  let stream = Kefir.emitter()

  if(pin > 12) {
    stream.error(new Error(`Board has no pin ${pin}.`))
  }

  setInterval(() => {
    stream.emit(readTemperature(pin))
  }, 500)

  return stream
}

Kefir.zip([
  temperatureSensor(1),
  temperatureSensor(42) // Invalid pin, should call .error
]).onValue((state) => {
  // do something with sensor values
}).onError(() => {
  console.error('An error occurred!')
})

此代码几乎没有问题:

    永远不会调用
  1. .onError.onError被调用后附加.error。也许使用属性而不是流,但我不知道如何......
  2. .zip不是理想的功能,我需要这样的东西:
  3. 每当传感器值发生变化时,同步传感器,调用.onValue,然后调用.onValue

    a:    ----20------------21--------------
    b:    -------25--------------------24---
    ab:   --------•----------•----------•---
           [20, 25]   [21, 25]   [21, 24]
    

    感谢您的任何建议。

1 个答案:

答案 0 :(得分:3)

有一个内置功能可以从函数Kefir.fromPoll中读取值。

function temperatureSensor(pin) {
  return Kefir.fromPoll(500, function() {
    return readTemperature(pin)
  }
}

对于错误处理,我只会使用标准的javascript错误功能,例如。抛出一个错误。在创建流时,您可以知道引脚是否正确,因此无需进行反应式编程。

您正在寻找的组合函数是combine。完整的例子是:

function temperatureSensor(pin) {    
  if(pin > 12) {
    throw new Error(`Board has no pin ${pin}.`)
  }

  return Kefir.fromPoll(500, function() {
    return readTemperature(pin)
  }
}

Kefir.combine([
  temperatureSensor(1),
  temperatureSensor(42)
]).onValue((state) => {
  // do something with sensor values
}).onError(() => {
  console.error('An error occurred!')
})