Ich fange an, RxJS zu verwenden, und ich verstehe nicht, warum wir in diesem Beispiel eine Funktion wie flatMap
oder verwenden müssen concatAll
. Wo ist das Array von Arrays hier?
var requestStream = Rx.Observable.just('https://api.github.com/users');
var responseMetastream = requestStream
.flatMap(function(requestUrl) {
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
});
responseMetastream.subscribe(url => {console.log(url)})
Wenn jemand visuell erklären kann, was passiert, ist dies sehr hilfreich.
javascript
rxjs
user233232
quelle
quelle
flatMap
es benannt worden wäremapThenFlatten
, wäre es weniger verwirrend.Antworten:
Als ich anfing, einen Blick darauf zu werfen,
Rxjs
stolperte ich auch über diesen Stein. Was mir geholfen hat, ist Folgendes:flatMap
: http://reactivex.io/documentation/operators/flatmap.htmlflatMap
, Sie müssenmergeMap
stattdessen schauen (ein anderer Name).Schauen Sie sich endlich die Typinformationen von RxJava an. Nicht getipptes Javascript hilft hier nicht. Grundsätzlich
Observable<T>
bezeichnet if ein beobachtbares Objekt, das Werte vom Typ TflatMap
überträgt, eine Funktion vom TypT' -> Observable<T>
als Argument und gibt sie zurückObservable<T>
.map
übernimmt eine Funktion vom TypT' -> T
und gibt zurückObservable<T>
.Zurück zu Ihrem Beispiel: Sie haben eine Funktion, die Versprechen aus einer URL-Zeichenfolge erzeugt. Also
T' : string
undT : promise
. Und von dem, was wir vorher gesagt habenpromise : Observable<T''>
, alsoT : Observable<T''>
mitT'' : html
. Wenn Sie diese vielversprechende Funktion einsetzenmap
, erhalten Sie,Observable<Observable<T''>>
wann Sie wollenObservable<T''>
: Sie möchten, dass das Observable diehtml
Werte ausgibt.flatMap
wird so genannt, weil es das Ergebnis von abflacht (eine beobachtbare Schicht entfernt)map
. Abhängig von Ihrem Hintergrund mag dies für Sie chinesisch sein, aber mit den Tippinformationen und der Zeichnung von hier wurde mir alles klar: http://reactivex.io/documentation/operators/flatmap.html .quelle
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
,return jQuery.getJSON(requestUrl);
daflatMap
auch eine Auswahlfunktion akzeptiert wird, die ein Versprechen zurückgibt, dh eine Funktion vom TypT' -> Promise
.T’ -> T
? Ich verstehe dasT
als Generikum, aber was ist der Apostroph und der fettfreie Pfeil?Sie verwenden flatMap, wenn Sie ein Observable haben, dessen Ergebnisse mehr Observables sind.
Wenn Sie ein Observable haben, das von einem anderen Observable erzeugt wird, können Sie es nicht direkt filtern, reduzieren oder abbilden, da Sie ein Observable haben, das nicht die Daten enthält. Wenn Sie eine beobachtbare Datei erstellen, wählen Sie flatMap anstelle der Karte. dann bist du okay
Wie im zweiten Snippet müssen Sie flatMap verwenden, wenn Sie einen asynchronen Vorgang ausführen.
quelle
flatMap
Verwandeln Sie die von einem Observable emittierten Elemente in neue Observables und glätten Sie dann die Emissionen aus diesen in ein einzelnes Observable.Schauen Sie sich das folgende Szenario an,
get("posts")
in dem ein Observable zurückgegeben wird, das von "abgeflacht" wirdflatMap
.quelle
Menschen neigen dazu, Dinge zu komplizieren, indem sie die Definition geben, die besagt:
Ich schwöre, diese Definition verwirrt mich immer noch, aber ich werde sie auf einfachste Weise anhand eines Beispiels erklären
Unsere Situation : Wir haben ein Observable, das Daten zurückgibt (einfache URL), die wir verwenden werden, um einen HTTP-Aufruf durchzuführen, der ein Observable zurückgibt, das die benötigten Daten enthält, damit Sie die Situation wie folgt visualisieren können:
Wie Sie sehen, können wir die benötigten Daten nicht direkt erreichen. Als erste Möglichkeit, die Daten abzurufen, können wir nur normale Abonnements wie diese verwenden:
Dies funktioniert, aber wie Sie sehen, müssen wir Abonnements verschachteln, um unsere Daten zu erhalten. Dies sieht derzeit nicht schlecht aus. Stellen Sie sich jedoch vor, wir haben 10 verschachtelte Abonnements, die nicht mehr gewartet werden können.
Ein besserer Weg, dies zu handhaben, besteht darin, nur den Operator zu verwenden, der
flatMap
das Gleiche tut, aber dieses verschachtelte Abonnement vermeidet:quelle
Einfach:
quelle
Es ist kein Array von Arrays. Es ist ein Observable von Observable (s).
Im Folgenden wird ein beobachtbarer Zeichenfolgenstrom zurückgegeben.
Während dies einen beobachtbaren Strom von beobachtbarem Strom von json zurückgibt
flatMap
glättet das Observable automatisch für uns, damit wir den JSON-Stream direkt beobachten könnenquelle
flatMap
(undmap
) für Arrays nichts Besonderes sind. Es ist möglich, diese Operationen für jeden generischen Container oder Wrapper zu definieren, einschließlich Arrays, Wörterbücher, "Optionals", reaktive Streams, Versprechen, Zeiger und sogar Funktionen selbst. Dies ist eine emergente Eigenschaft eines mathematischen Konstrukts namens Monade. Alle obigen Beispiele erfüllen die Anforderungen, um eine Monade zu sein, und daher können sie alle eine Definition vonmap
und a erhaltenflatMap
(mit einigen Einschränkungen).Ein Observable ist ein Objekt, das einen Strom von Ereignissen ausgibt: Next, Error und Completed.
Wenn Ihre Funktion eine Observable zurückgibt, gibt sie keinen Stream zurück, sondern eine Instanz von Observable. Der
flatMap
Bediener ordnet diese Instanz einfach einem Stream zu.Dies ist das Verhalten im
flatMap
Vergleich zumap
: Führen Sie die angegebene Funktion aus und reduzieren Sie das resultierende Objekt zu einem Stream.quelle
Hier wird die äquivalente Implementierung einer flatMap mithilfe von Abonnements gezeigt.
Ohne flatMap:
Mit flatMap:
http://plnkr.co/edit/BHGmEcdS5eQGX703eRRE?p=preview
Hoffe es könnte helfen.
Olivier.
quelle
Mit flatMap
Ohne flatMap
quelle