2015-09-07 73 views
0

在下面的代碼:合併性能

http://jsfiddle.net/staltz/4gGgs/27/

var clickStream = Rx.Observable.fromEvent(button, 'click'); 

var multiClickStream = clickStream 
    .buffer(function() { return clickStream.throttle(250); }) 
    .map(function(list) { return list.length; }) 
    .filter(function(x) { return x > 1; }); 

// Same as above, but detects single clicks 
var singleClickStream = clickStream 
    .buffer(function() { return clickStream.throttle(250); }) 
    .map(function(list) { return list.length; }) 
    .filter(function(x) { return x === 1; }); 

// Listen to both streams and render the text label accordingly 
singleClickStream.subscribe(function (event) { 
    document.querySelector('h2').textContent = 'click'; 
}); 
multiClickStream.subscribe(function (numclicks) { 
    document.querySelector('h2').textContent = ''+numclicks+'x click'; 
}); 
Rx.Observable.merge(singleClickStream, multiClickStream) 
    .throttle(1000) 
    .subscribe(function (suggestion) { 
     document.querySelector('h2').textContent = ''; 
    }); 

多少次點擊流序列將merge後重復? 我的意思是,它看起來就像這樣:

情況1

 for(numclicks : clickStream.length){ 
     if (numclicks === 1){ 
      document.querySelector('h2').textContent = 'click'; 
     } 
    }; 
    for(numclicks : clickStream.length){ 
     if (numclicks > 1){ 
      document.querySelector('h2').textContent = ''+numclicks+'x click'; 
     } 
    }; 

否則將被內部,真的合併,這樣的(僞):

情況下2

for(numclicks: clickStream.length){ 
     if (numclicks === 1){ 
      document.querySelector('h2').textContent = 'click'; 
     }else if(numclicks > 1){ 
      document.querySelector('h2').textContent = ''+numclicks+'x click'; 
     } 
    } 

我個人認爲,這只是順序合併將流應用於其參數(案例1)。

P.S.我希望有這樣的事情有一些標準。但是如果沒有 - 我對RxCpp和鈉的實施特別感興趣。 我以js爲例,更具互動性。

回答

1

fromEvent返回一個來源,所以所有用戶共享for循環的相同迭代。

忽略油門電話,結果是相似的:

for(numclicks: clickStream.length){ 

    // first subscription 
    if (numclicks === 1){ 
     document.querySelector('h2').textContent = 'click'; 
    } 

    // second subscription 
    if(numclicks > 1){ 
     document.querySelector('h2').textContent = ''+numclicks+'x click'; 
    } 

    // merged subscription 
    if (numclicks === 0) { 
     document.querySelector('h2').textContent = ''; 
    } 
} 

油門調用意味着for循環的唯一點擊流的主體實際上只是推click事件到兩個緩衝區,並正在重置的計時器三個油門操作員中的每一個。當三個節氣門定時器之一啓動時設置h2。由於定時器不被共享它像一個單獨的每與各回路設定H2油門計時器循環到僅三個可能的值之一:

此行爲是在所有與Rx家族相似。

特別是關於rxcpp:

rxcpp缺少緩衝過載,允許觀察到的觸發到新的緩衝器的過渡。 rxcpp尚未實施油門。 默認情況下,rxcpp不是線程安全的(即付即玩),因此如果使用的節流計時器引入線程,則必須使用協調來明確添加線程安全性。

+0

1)「rxcpp缺少允許observable觸發轉換到新緩衝區的緩衝區過載」 - 這是什麼意思? 2)是否可以修改LINQ,所以'if's變成'ifelse's /'switch'? :) – tower120

+0

jsfiddle中使用的緩衝區操作符接受一個返回可觀察值的函數。 rxcpp不支持這種形式的緩衝區操作符。 –

+0

我相信if/else是不可能的,因爲每個塊都是獨立的函數。 –