Ich versuche, meinen Kopf um Observable zu wickeln. Ich mag die Art und Weise, wie Observables Entwicklungs- und Lesbarkeitsprobleme lösen. Während ich lese, sind die Vorteile immens.
Observables auf HTTP und Sammlungen scheinen einfach zu sein. Wie kann ich so etwas in ein beobachtbares Muster umwandeln?
Dies ist von meiner Servicekomponente, um die Authentifizierung bereitzustellen. Ich würde es vorziehen, wenn dies wie andere HTTP-Dienste in Angular2 funktioniert - mit Unterstützung für Daten-, Fehler- und Abschlusshandler.
firebase.auth().createUserWithEmailAndPassword(email, password)
.then(function(firebaseUser) {
// do something to update your UI component
// pass user object to UI component
})
.catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
Jede Hilfe hier wäre sehr dankbar. Die einzige alternative Lösung, die ich hatte, war, EventEmitter
s zu erstellen . Aber ich denke, das ist eine schreckliche Art, Dinge im Dienstleistungsbereich zu tun
quelle
from
Methode Observable zurück, sendet jedoch Versprechen als Wert an Abonnements. :(operators
über "Intuition" zu importieren - ich habe mich geirrt.Versuche dies:
Den vollständigen Verweis auf den fromPromise-Operator finden Sie hier .
quelle
import 'rxjs/add/observable/fromPromise';
import { Observable } from "rxjs/Observable";
:)1 Direkte Ausführung / Konvertierung
Verwenden Sie
from
diese Option, um ein zuvor erstelltes Versprechen direkt in ein Observable umzuwandeln.observable$
wird ein heißes Observable sein , das den Versprechungswert für Abonnenten effektiv wiedergibt.Der Versprechenskörper wird ausgeführt oder wurde bereits aufgelöst, als das Observable erstellt wurde. Wenn das innere Versprechen gelöst wurde, erhält ein neuer Abonnent des Observablen sofort seinen Wert.
2 Aufgeschobene Ausführung bei jedem Abonnement
Verwenden Sie diese Funktion
defer
mit einer Versprechen-Factory-Funktion als Eingabe, um die Erstellung und Umwandlung eines Versprechens in ein Beobachtbares zu verschieben.observable$
wird eine Erkältung zu beobachten sein .Der Unterschied
from
besteht darin, dassdefer
auf einen Abonnenten gewartet wird und erst dann ein neues Versprechen erstellt wird, indem die angegebene Versprechen-Factory-Funktion aufgerufen wird. Dies ist nützlich, wenn Sie ein Observable erstellen möchten, aber nicht möchten, dass das innere Versprechen sofort ausgeführt wird. Das innere Versprechen wird nur ausgeführt, wenn jemand das Beobachtbare abonniert. Jeder Abonnent erhält außerdem seine eigene neue Beobachtungsgröße.3 Viele Betreiber akzeptieren Versprechen direkt
Die meisten RxJS Operatoren , die kombinieren (zB
merge
,concat
,forkJoin
,combineLatest
...) oder verwandeln Observablen (zBswitchMap
,mergeMap
,concatMap
,catchError
...) direkt Versprechen akzeptieren. Wenn Sie eines davon trotzdem verwenden, müssen Sie es nicht verwendenfrom
, um zuerst ein Versprechen zu verpacken (aber um ein kaltes Observable zu erstellen, müssen Sie es möglicherweise noch verwendendefer
).Überprüfen Sie die Dokumentation oder Implementierung, um festzustellen, ob der von Ihnen verwendete Operator
ObservableInput
oder akzeptiertSubscribableOrPromise
.Der Unterschied zwischen
from
unddefer
in einem Beispiel: https://stackblitz.com/edit/rxjs-6rb7vfquelle
Sie können auch einen Betreff verwenden und dessen next () -Funktion aus Versprechen auslösen . Siehe Beispiel unten:
Code wie unten hinzufügen (ich habe Service verwendet)
Erstellen Sie einen Benutzer aus einer Komponente wie unten
quelle
rxjs
.new Observable(observer => { ... observer.next() ... })
wie Sie es implementieren können. Obwohl es sich um eine Neuimplementierung bestehender bekannter Funktionen handeln würde, würde es die Frage direkt beantworten und wäre für die Leser nicht schädlich.Sie können auch defer verwenden . Der Hauptunterschied besteht darin, dass das Versprechen nicht eifrig gelöst oder abgelehnt wird.
quelle
Sie können einen Wrapper um die Versprechen-Funktionalität hinzufügen, um ein Observable an den Beobachter zurückzugeben.
quelle