RxJS Map-array zu beobachten und zurück zu Ebene-Objekt im array
Ich habe ein array von Objekten, von denen ich mich übergeben muss jedes Objekt einzeln in die async-Methode (Prozess hinter gehandhabt wird mit Versprechen und dann umgewandelt wieder zu Beobachten über Observable.fromPromise(...)
- dieser Weg ist erforderlich, da die gleiche Methode wird verwendet, wenn nur ein einzelnes Objekt übergeben, jederzeit; der Prozess ist, speichern von Objekten in die Datenbank). Dies ist ein Beispiel für ein array von Objekten:
[
{
"name": "John",
...
},
{
"name": "Anna",
...
},
{
"name": "Joe",,
...
},
{
"name": "Alexandra",
...
},
...
]
Nun habe ich die Methode " insert which
die fügt Objekt in die Datenbank ein. Die store
Methode aus der Datenbank-Instanz gibt die neu erzeugte id. Am Ende des ersten Objekts kopiert und abgebildet mit seiner neuen id:
insert(user: User): Observable<User> {
return Observable.fromPromise(this.database.store(user)).map(
id => {
let storedUser = Object.assign({}, user);
storedUser.id = id;
return storedUser;
}
);
}
Dies funktioniert gut, falls ich die einfügen einzelnes Objekt. Ich möchte jedoch hinzufügen der Unterstützung für das einfügen von mehreren Objekten, die rufen Sie einfach die Methode, die für die einzelnen insert. Derzeit ist dies, was ich habe, aber es funktioniert nicht:
insertAll(users: User[]): Observable<User[]> {
return Observable.forkJoin(
users.map(user => this.insert(user))
);
}
Den insertAll
Methode ist das einfügen von Nutzern, wie erwartet (oder etwas anderes füllte sich die Datenbank mit Benutzer), aber ich bekomme keine Antwort zurück von ihm. Ich war zu Debuggen, was passiert ist und scheint, dass forkJoin
ist immer Antwort, nur von dem ersten Benutzer zugeordnet, aber andere werden ignoriert. Abonnement insertAll
tut man nicht alles, es gibt auch keine etwaige Fehler entweder über fangen auf insertAll
oder über den zweiten parameter abonnieren insertAll
.
So, ich bin auf der Suche nach einer Lösung, bei der der Beobachtbaren (in insertAll
) emittieren würde wieder eine Vielzahl von neuen Objekten mit den Nutzern in dieser form:
[
{
"id": 1,
"name": "John",
...
},
{
"id": 2,
"name": "Anna",
...
},
{
"id": 3,
"name": "Joe",,
...
},
{
"id": 4,
"name": "Alexandra",
...
},
...
]
Ich wäre sehr froh für jede Anregung in die richtige Richtung. Vielen Dank im Voraus!
Promise.all
? (Auch in deinem ersten code-snippet erstellen Sie eine storedUser
, aber zurück user
statt storedUser
.)Vielen Dank für die tolle Anregung, zum Glück ist es kein problem, mit dem gleichzeitigen Versprechen. Es war ein Tippfehler in diesem Beispiel, das ich jetzt behoben.
InformationsquelleAutor user1257255 | 2017-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Umwandeln von array zu beobachten, die Sie verwenden können
Rx.Beobachtbar ist.aus(array)
.Konvertieren von observable-array, verwenden Sie
obs.toArray()
. Beachten Sie dies tut Rückkehr eine beobachtbare eines Arrays, so müssen Sie noch.subscribe(arr => ...)
um es zu bekommen.Sagte, dass Ihr code mit
forkJoin
hat korrekt Aussehen. Aber wenn Sie wollen, um zu versuchenfrom
schreiben Sie den code so:Anderen mehr rx wie Weg, dies zu tun wäre zu emittieren-Werte, wie Sie komplett, und nicht warten, bis alle von Ihnen wie
forkJoin
odertoArray
tut. Können wir Sie einfach weglassentoArray
aus dem vorherigen Beispiel und wir haben es:Als @cartant erwähnt, ist das problem möglicherweise nicht in Rx, es könnte die Datenbank keine Unterstützung für mehrere verbindungen. In diesem Fall können Sie ersetzen die
mergeMap
mitconcatMap
zu machen, Rx senden, nur 1 gleichzeitiger Anforderung:forkJoin
zufrom
undmergeMap
+toArray
ging alles wie erwartet funktioniert.InformationsquelleAutor Dorus