2017-05-29 96 views
1

比方說,我有兩個bacon.js流:重構共同組合子出bacon.js流

const stream1 = $('#input1').asEventStream('input') 
    .map(e => e.target.value) 
    .filter(inp => inp.length > 3) 
    .log(); 
const stream2 = $('#input2').asEventStream('input') 
    .map(e => e.target.value) 
    .filter(inp => inp.length > 3) 
    .log(); 

我想提取由輸入長度的濾波共同邁進一個變量,它同時適用於之後的幻想代碼:

const my_filter = Bacon.map(e => e.target.value).filter(inp => inp.length > 3) 
const stream1 = $('#input1').asEventStream('input') 
    .apply(my_filter) 
    .log(); 
const stream2 = $('#input2').asEventStream('input') 
    .apply(my_filter) 
    .log(); 

有沒有一種習慣的方式來做到這一點?

EDIT1:澄清,my_filter只是一個例子。我希望能夠重構任意的組合器鏈並將它們應用於多個流。編輯2:作爲保佑雅虎注意到,我需要一個額外的地圖來獲取事件的價值。這表明我的問題更好。

回答

1

對我來說,這看起來像一個基本的軟件重構問題。

通常,如果要將任意轉換應用於流,則可能需要編寫一個將流作爲參數的函數,並返回修改後的流作爲結果。

在你的特定情況下,我會通過提取功能中的步驟來消除重複。

const getValue = input => input.target.value 
const my_filter = stream => stream.filter(text => text.length > 3) 
const filteredInputValue = ($input) => { 
    my_filter($input.asEventStream('input').map(getValue)) 
const stream1 = filteredInputValue($('#input1')).log() 
const stream2 = filteredInputValue($('#input2')).log() 

在此示例中,您可以輕鬆修改my_filter以應用任何其他轉換,例如調節和文本修整。

+1

你無法比創造者本人做得更好。 :)這個答案也幫助我了。 –

0

添加映射函數來獲取值出了大事(我認爲這是一個培根方便易用的功能爲好),改變你my_filter的功能,並在信息流中帶有過濾器把它叫做:

const getValue = inp=>inp.target.value; 
const my_filter = inp => inp.length > 3 
const stream1 = $('#input1').asEventStream('input') 
    .map(getValue) 
    .filter(my_filter) 
    .log(); 
const stream2 = $('#input2').asEventStream('input') 
    .map(getValue) 
    .filter(my_filter) 
    .log(); 

這是的例子在這裏:http://jsbin.com/vahejuv/edit?html,js,console,output