Ich habe den folgenden Code:beobachtbaren Warten Sie für alle mit rxjs
this.hubService.sendScopedCommand(Constants.hangarCommands.getHangarsOfPlayer).then((result: ICommand) => {
let hangars: IHangar[] = result.arguments[0];
for (let hangar of hangars) {
this.pieceService.getGroupedPieces(hangar.pieces).subscribe(group => hangar.groupedPieces = group);
}
this.hangars$.next(hangars);
}, (ex: any) => this.hangars$.error(ex));
Also im Grunde sendScopeCommand
ist etwas über ein websocket Senden und die then
Funktion ausgeführt wird, wenn eine Antwort auf die websocket empfangen wird. An diesem Punkt erhalte ich ein Array von Objekten, die ich in hangars
eingegeben habe.
In diesen Objekten habe ich ein Array aller Stücke, die der Spieler besitzt. Es könnte mehrere Stücke mit demselben Stücktyp geben, also habe ich eine Funktion gemacht, um sie zu gruppieren: getGroupedPieces
. Sein Code ist der folgende:
public getGroupedPieces(pieces: IPiece[]): Observable<IGroupedPiece[]> {
return Observable
.from(pieces)
.groupBy(p => p.pieceTypeId)
.flatMap(p => p.toArray())
.map(p => { return <IGroupedPiece>{ amount: p.length, piece: p[0] }; })
.toArray();
}
Dieser Code funktioniert, aber ich bin ziemlich sicher, dass es nicht korrekt ist. In der Tat, ich denke, dass hangars
ist auf der beobachtbaren bereits vor dem beobachtbaren in der for
Schleife abgeschlossen sind.
Was ich hier möchte, ist warten auf alle diese beobachtbaren zu vervollständigen, bevor hangars
auf dem Observable emittieren.
Warum nicht emittieren Das Ereignis, wenn der Abonnent angerufen wird? –