H, habe ich Probleme in richtig mit rxJs beobachtbar. Meine Anforderung ist, alle Chatrooms auf ein Buch zu bekommen (wenn das Zimmer nicht verfügbar ist, einen neuen Chatraum erstellen) Ich benutze den untenstehenden Code und die beobachtbare Komponente im Chat wird nie aufgerufen.Observable Gabel Join funktioniert nicht
meine Chat-Komponente
@Component({
selector: 'chat',
templateUrl: './chat.component.html'
})
export class ChatComponent implements OnInit {
this.selectbookStream.subscribe(bookId=>
{
this.chatService.getRooms(book id)
.subscribe(rooms => {
console.log("in chat component");
console.log(rooms);
this.rooms = rooms;
});
})
}
Mein Chat-Dienst
@Injectable()
export class ChatService {
public getRooms(bookID) {
console.log("in get rooms")
return this.thisPartyChatService.createRooms(bookID).map(r=>r)
}
}
Drittanbieter-Chat-Service
public createRooms(bookID: string): Observable<any> {
let rooms = [];
this.modelService.getBookDetails(bookID).subscribe(book=> {
this.getRoom(book.name).subscribe(r => {
if (Object.keys(r).length === 0) {
rooms.push(this.createRoom(book.name).map(res=>res))
} else {
// rooms.push(Observ)
rooms.push(Observable.of({
'id': r.id,
'type': r.type,
'title': r.title,
'name': r.title,
'created': r.created
})
)
}
})
});
return Observable.forkjoin(rooms);
}
public createRoom(bookID: string): Observable<any> {
return this.http.post(this.apiUrl.room, { 'title': bookID, 'teamId':
teamId }, this.generateHeader()).map(res => res.json);
}
public getRoom(modelId: string): Observable<any> {
this.roomTitle = modelId;
// search all rooms in CISCO sparck and match with modelId
return this.http.get(this.apiUrl.room, this.generateHeader())
.map(this.findRoom);
}
private findRoom(res: Response) {
let body = res.json();
let room: any;
body.items.forEach(element => {
if (element.title == this.roomTitle)
return element;
});
return {};
}
Ich bin mir nicht sicher, warum Sie 'forkJoin' though verwenden. Es klingt wie du willst 'defaultIfEmpty'. 'forkJoin' dient dazu, mehrere Observablen parallel (theoretisch sowieso) zu laufen und ihre Ergebnisse vorhersagbar zu kombinieren. –
Ich bin sehr neu rxJS, können Sie etwas mehr Details zur Verwendung von defaultEmtpy in meinem Fall geben ..? –
Es liefert Elemente aus der Quelle oder, wenn die Quelle leer ist, liefert es den angegebenen Standardwert. Bsp .: 'Observable.from ([]). DefaultIfEmpty (1)' ergibt '1'. –