2015-04-12 1 views
3

Я использую 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] 

Спасибо за любые советы.

+0

Да, я думаю, что свойство было бы более подходящим для датчика, который измеряет непрерывное значение. – Bergi

ответ

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!') 
})