2015-04-12 43 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!') 
})