Nach https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/manyselect.md die extent
/manySelect
Verfahren a comonadic Transformator ist, die die Form von Observable a -> (Observable a -> b) -> Observable b
hat, "umgekehrt" die Version von selectMany
/flatMat
.Was macht die Methode except/manySelect in RxJS?
Das Beispiel in der Dokumentation gegeben:
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
Mein Verständnis ist, dass manySelect
wird jeden beobachteten Wert in eine Observable
Einwickeln (durch so etwas wie Rx.Observable.just(x)
), es dann in die Auswahlfunktion setzen, fusionieren schließlich alle zurück Werte in eine neue Observable
.
Wenn ich jedoch ändern ys.first()
zu ys.count()
oder ys.last()
, stürzt das Programm ab und sagt Error: TypeError: innerSource.subscribe is not a function
.
Was passiert? Was macht manySelect
wirklich und wann sollten wir es benutzen?
Thanks @ user3743222, fand ich die Antwort für das Verhalten von flatMap:
Beachten Sie, dass FlatMap die Emissionen dieser Observablen geht, so dass sie verschachteln können.
Vielen Dank für den Link. Jetzt weiß ich, warum die flatMap so funktioniert: "Beachten Sie, dass FlatMap die Emissionen dieser Observablen zusammenführt, so dass sie verschachtelt werden können." – nnkken
Aber ich verstehe immer noch nicht, warum es Fehler geben wird, wenn ich andere Operatoren wie 'last 'verwende 'oder' count' ... https://jsfiddle.net/u5rs0yfg/ http://jsbin.com/dexutet/1/edit?html,js,output – nnkken
Dies hat wahrscheinlich mit der Implementierung der zu tun 'manySelect': https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/manyselect.js. Ein verkettetes Muster wird verwendet, so dass die Emission eines Wertes zu mehreren Observablen emittiert wird. Was mit "last" oder "count" passiert, ist, dass sie erst dann emittieren, wenn die Quelle vollständig ist (anders als "first"). Wenn die Verkettung später stattfindet, gibt es nichts mehr zu verketten (das ist meine Hypothese). – user3743222