gpt4 book ai didi

javascript - 响应式(Reactive)编程的初学者问题

转载 作者:行者123 更新时间:2023-11-29 10:40:52 25 4
gpt4 key购买 nike

我正在使用 Kefir.js对于响应式(Reactive)编程,但我有一些麻烦。我有一个带有 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 错误功能,例如。抛出一个错误。您可以在创建流时知道 pin 是否正确,因此无需响应式编程。

您要查找的组合器函数是 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!')
})

关于javascript - 响应式(Reactive)编程的初学者问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29589638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com