2016-04-17 4 views
1

Я не совсем понимаю этого оператора.Понимание groupJoin

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupjoin.md

Как понять эти части:

Корреляты элементы двух последовательностей на основе перекрывающихся длительностей и группирует результаты.

leftDurationSelector (Function): функция для выбора продолжительности (выражаемой как наблюдаемая последовательность) каждого элемента левой наблюдаемой последовательности, используемой для определения перекрытия. rightDurationSelector (Function): функция для выбора продолжительности (выражаемой как наблюдаемая последовательность) каждого элемента правой наблюдаемой последовательности, используемой для определения перекрытия.

С 4-го аргумента:

(Наблюдаемое) наблюдаемая последовательность с элементами из правильной последовательности, которые перекрываются с элементом левой последовательности в.

Почему здесь 2-й и 3-й аргументы такие? Что делает таймер (0) полезным для нас? Я понимаю, что таймер (0) после 0 секунд возвращает значение 0 и завершает. И что?

var xs = Rx.Observable.interval(100) 
    .map(function (x) { return 'first' + x; }); 

var ys = Rx.Observable.interval(100) 
    .map(function (x) { return 'second' + x; }); 

var source = xs.groupJoin(
    ys, 

    function() { return Rx.Observable.timer(0); }, 
    function() { return Rx.Observable.timer(0); }, 
    function (x, yy) { 
     return yy.select(function (y) { 
      return x + y; 
     }) 
    }).mergeAll().take(5); 

var subscription = source.subscribe(
    function (x) { 
     console.log('Next: ' + x); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

Возможно, вы знаете лучший источник объяснений?

ответ

1

Вот источники, которые вы должны просмотреть для лучшего понимания groupJoin. Любопытством, к чему вы стремитесь достичь с помощью этого оператора? Могут быть альтернативные способы сделать то же самое. Мне еще предстоит практическое интересное использование groupJoin.

Я рекомендую вам просмотреть эти ресурсы в порядке (и начать с понимания join), и провести некоторое время на мрамор, чтобы понять, что происходит.

О примере официальной документации timer(0) в основном дает вам селектора продолжительности одного тика. Селектор длительности служит только как сигналы, их значения не имеют отношения к выходу. Когда селектор продолжительности выбрасывает значение или заканчивается, происходит вещество (эмиссия сгруппированных значений из обоих потоков). В то время как они не испускают значение, которое не заканчивается, происходит и то, что происходит (группировка значений из обоих потоков).

Функция выбора, которую вы передаете, получает сгруппированные значения и вычисляет из нее другие значения. С groupJoin этот селектор получает значение от первого источника и наблюдаемый, который группирует все соответствующие значения из второго источника, и вы делаете с ним любую логику.

+0

Я просто пытаюсь понять это, потому что я думаю, что это может быть полезно позже при написании кода с RxJS. Позже будут проверять эти ресурсы –

0

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

Были упомянуты окна. И оказывается, что эти стрелки представляют окна.

Второй и третий параметр ширина окна:

function() { return Rx.Observable.timer(500); } 

В приведенном выше примере ширина окна составляет 500 миллисекунд (при условии, что в этом случае мы можем измерить ширину в единицах времени).

Я нарисовал графическое изображение, которое выглядит для меня больше как окна:

enter image description here

Так из моего графика мы видим, например, что черное окно пересекается с зеленым окном и поэтому события соединяются функции в 4-й параметр.

То же самое с зеленым и красным.

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

необходимо также дополнительные окна исследования ширины 0, так как визуально ищет их не существует, я имею в виду, если есть окно, я думаю, что имея ширину> 0.

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