2016-04-20 4 views
0

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?

JSBin

auch eine geringe Frage: Wenn manySelect Testen fand ich, dass `Rx.Observable.range (0, 5) .flatMap (() => [1, 2, 3, 4 ]) `Ergebnisse in einer Reihenfolge wie folgt: OnNext: 1 OnNext: 2 OnNext: 1 OnNext: 3 OnNext: 2 OnNext: 1 OnNext: 4 OnNext: 3 OnNext: 2 OnNext: 1 OnNext: 4 OnNext: 3 OnNext: 2 OnNext: 1 OnNext: 4 OnNext: 3 OnNext: 2 OnNext: 4 OnNext: 3 OnNext: 4 Completed Während `Rx.Observable. interval (0) .take (10) .flatMap (() => [1, 2, 3, 4]) `gibt ein Ergebnis mit der richtigen Reihenfolge. Ist das ein Fehler oder eine Funktion?

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.

Antwort

0

Zwei zusätzliche Ressourcen für das Verständnis manySelect:

manySelect Der Operator wird oft als ein „bind comonadic beschrieben."Wenn das die Dinge für Sie aufräumt, sind Sie willkommen. Elsewise, ist hier eine Erklärung:

manySelect transformiert intern jedes Element von der Quelle emittierten beobachtbare in einen beobachtbaren, die das Element und alle Elemente emittiert anschließend von der Quelle emittierten beobachtbare, in der gleichen Reihenfolge. So zum Beispiel, es intern verwandelt ein Observable, das die Zahlen 1,2,3 in drei Observables emittiert: eine, die 1,2,3 emittiert, eine, die emittiert 2,3, und eine, die emittiert 3.

Dann manySelect geht jede dieser Observables in eine Funktion , die Sie bereitstellen, und emittiert, wie die Emissionen von der Observable, die manySelect zurückgibt, die Rückgabewerte von diesen Funktionsaufrufen.

Auf diese Weise kann jedes Element durch die resultierende Observable emittiert ist eine Funktion der entsprechenden Position in der Quelle beobachtbar und alle die Elemente von der Quelle, nachdem es Observable emittiert.

+0

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

+0

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

+0

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

Verwandte Themen