В соответствии с 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
, и когда мы должны его использовать?
Спасибо @ user3743222, я нашел ответ на поведение flatMap:
Обратите внимание, что FlatMap сливает выбросы этих наблюдаемых, так что они могут чередоваться.
Благодарим вас за ссылку. Теперь я знаю, почему flatMap будет действовать следующим образом: «Обратите внимание, что FlatMap объединяет выбросы этих Observables, чтобы они могли чередоваться». – nnkken
Но я до сих пор не понимаю, почему будут ошибки, когда я использую другие операторы, такие как 'last 'или' count' ... https://jsfiddle.net/u5rs0yfg/ http://jsbin.com/dexutet/1/edit?html,js,output – nnkken
Это, вероятно, связано с реализацией 'manySelect': https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/manyselect.js. Привязанный рисунок используется так, чтобы излучение одного значения излучалось в несколько наблюдаемых. Что происходит с 'last' или' count', так это то, что они не испускают, пока источник не будет завершен (в отличие от 'first'). Поэтому, когда цепочка происходит позже, больше нечего цепляться (это моя гипотеза). – user3743222