我使用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!')
})
此代码几乎没有问题:
.onError
(.onError
被调用后附加.error
。也许使用属性而不是流,但我不知道如何...... .zip
不是理想的功能,我需要这样的东西:每当传感器值发生变化时,同步传感器,调用.onValue,然后调用.onValue
a: ----20------------21--------------
b: -------25--------------------24---
ab: --------•----------•----------•---
[20, 25] [21, 25] [21, 24]
感谢您的任何建议。
答案 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!')
})