反应式编程的初学者问题

Beginner problems with reactive programming

我正在使用 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 不是一个理想的函数,我需要这样的东西:

同步传感器,每次传感器值变化时调用.onValue,然后调用.onValue

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

感谢您的任何建议。

有从函数中读取值的内置功能,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!')
})