2016-04-20 1 views
0

В соответствии с https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/manyselect.md, метод extent/manySelect является comonadic трансформатор, который имеет форму Observable a -> (Observable a -> b) -> Observable b, то «обратная» версия selectMany/flatMat.Что делает метод extent/manySelect в RxJS?

Пример, приведенный в документации:

var source = Rx.Observable.range(0, 3) 
    .manySelect(function (ys) { return ys.first(); }) 
    .mergeAll(); 

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

// => Next: 0 
// => Next: 1 
// => Next: 2 
// => Completed 

Я понимаю, что manySelect оборачивает каждую наблюдаемую величину в Observable (что-то вроде Rx.Observable.just(x)), а затем положить его в функцию селектора, наконец, объединить все возвращается значения в новый Observable.

Однако, если я изменю ys.first() к ys.count() или ys.last(), сбои программ и говорит Error: TypeError: innerSource.subscribe is not a function.

Что происходит? Что действительно делает manySelect, и когда мы должны его использовать?

JSBin

также незначительный вопрос: При тестировании manySelect, я обнаружил, что `Rx.Observable.range (0, 5) .flatMap (() => [1, 2, 3, 4 ]) `приводит к последовательности, как показано ниже: onNext: 1 onNext: 2 onNext: 1 onNext: 3 onNext: 2 onNext: 1 onNext: onNext: 3 onNext: 2 onNext: 1 onNext: onNext: 3 onNext: 2 onNext: 1 onNext: onNext: 3 onNext: 2 onNext: onNext: 3 onNext: Завершенный В то время как `Rx.Observable. интервал (0) .take (10) .flatMap (() => [1, 2, 3, 4]) `дает результат с правильной последовательностью. Это ошибка или функция?

Спасибо @ user3743222, я нашел ответ на поведение flatMap:

Обратите внимание, что FlatMap сливает выбросы этих наблюдаемых, так что они могут чередоваться.

ответ

0

Два дополнительных Ressources для понимания manySelect:

  • the unit tests!
  • the marbles. Это должно дать понять, почему ваш последний пример ведет себя так, как он. Для вашего первого вопроса вы должны предоставить jsfiddle, чтобы его можно было воспроизвести.
  • the actual implementation

manySelect оператор часто описывается как «comonadic связываются.«Если это очистит вас, пожалуйста. Elsewise, вот объяснение:

manySelect внутренне преобразует каждый элемент, испускаемый источником Наблюдаемых в наблюдаемый, который излучает этот пункт и все элементы впоследствии испускаемый источник наблюдаемого в том же порядке. Так, например, он внутренне преобразует Наблюдаемое значение, которое испускает номера 1,2,3 в число 3 наблюдаемых: один, который испускает 1,2,3, один из которых испускает 2,3, и тот, который испускает 3.

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

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

+0

Благодарим вас за ссылку. Теперь я знаю, почему flatMap будет действовать следующим образом: «Обратите внимание, что FlatMap объединяет выбросы этих Observables, чтобы они могли чередоваться». – nnkken

+0

Но я до сих пор не понимаю, почему будут ошибки, когда я использую другие операторы, такие как 'last 'или' count' ... https://jsfiddle.net/u5rs0yfg/ http://jsbin.com/dexutet/1/edit?html,js,output – nnkken

+0

Это, вероятно, связано с реализацией 'manySelect': https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/manyselect.js. Привязанный рисунок используется так, чтобы излучение одного значения излучалось в несколько наблюдаемых. Что происходит с 'last' или' count', так это то, что они не испускают, пока источник не будет завершен (в отличие от 'first'). Поэтому, когда цепочка происходит позже, больше нечего цепляться (это моя гипотеза). – user3743222