2015-09-07 12 views
0

В следующем коде:производительность слияния в функциональной Реактивная программирования (RX)

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 = ''; 
    }); 

Сколько раз Clickstream последовательность будет повторяться после 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 и Sodium. Я взял пример 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 = ''; 
    } 
} 

Дроссельные вызовы означают, что тело единственного потока щелчка для петли на самом деле просто нажатие кнопки мыши события в два буфер и сброс таймера в каждый из трех операторов дроссельной заслонки. h2 устанавливается при срабатывании одного из трех таймеров дроссельной заслонки. поскольку таймеры не используются совместно, это походит на отдельный цикл для каждого таймера дроссельной заслонки с каждой установкой h2 петли только с одним из трех возможных значений:

Такое поведение аналогично во всех семействах Rx.

Относительно rxcpp в частности:

rxcpp отсутствует перегрузка буфера, который позволяет наблюдаемой, чтобы вызвать переход в новый буфер. У rxcpp еще нет дроссельной заслонки. rxcpp по умолчанию не является потокобезопасным (pay-for-play), поэтому, если используемые таймеры дроссельной заслонки вводят потоки, тогда необходимо использовать координаты для явного добавления безопасности потоков.

+0

1) «В rxcpp отсутствует перегрузка буфера, которая позволяет наблюдаемому инициировать переход к новому буферу» - что это значит? 2) Возможно ли изменить LINQ, поэтому 'if's' 'ifelse' '' 'switch'? :) – tower120

+0

Оператор буфера, используемый в jsfiddle, выполняет функцию, возвращающую наблюдаемую. rxcpp еще не поддерживает эту форму буфера. –

+0

Я считаю, что если/else невозможно, учитывая, что каждый блок является отдельной функцией. –

Смежные вопросы