Angular 可观察的fork-join不起作用
H、 我在正确使用rxJs observable时遇到问题。我的要求是,如果聊天室不可用,则在一本书上创建一个新的聊天室 我正在使用下面的代码,聊天组件中的observable从未被调用 我的聊天组件Angular 可观察的fork-join不起作用,angular,rxjs,Angular,Rxjs,H、 我在正确使用rxJs observable时遇到问题。我的要求是,如果聊天室不可用,则在一本书上创建一个新的聊天室 我正在使用下面的代码,聊天组件中的observable从未被调用 我的聊天组件 @Component({ selector: 'chat', templateUrl: './chat.component.html' }) export class ChatComponent implements OnInit { this.selectbookStream.subscribe
@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;
});
})
}
我的聊天服务
@Injectable()
export class ChatService {
public getRooms(bookID) {
console.log("in get rooms")
return this.thisPartyChatService.createRooms(bookID).map(r=>r)
}
}
第三方聊天服务
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 {};
}
可能是因为您需要在函数内部调用服务,所以没有调用该服务。例如,您的组件实现了OnInit,因此您可以将服务调用放在该函数中,并使组件以如下方式结束:
@Component({
selector: 'chat',
templateUrl: './chat.component.html'
})
export class ChatComponent implements OnInit {
public rooms = [];
public ngOnInit() {
this.selectbookStream.subscribe(bookId => {
this.chatService.getRooms(book id)
.subscribe(rooms => {
console.log("in chat component");
console.log(rooms);
this.rooms = rooms;
});
})
}
}
我认为问题在于createRooms方法的结构。基本上你有以下几点:
public createRooms(bookID: string): Observable<any> {
let rooms = [];
this.modelService.getBookDetails(bookID).subscribe(book => {
this.getRoom(book.name).subscribe(...);
})
return Observable.forkjoin(rooms);
}
我不知道你为什么要使用forkJoin。听起来你想让defaultIfEmpty。forkJoin在理论上用于并行运行多个观测值,并可预测地组合它们的结果。我是非常新的rxJS,您能否在我的例子中提供更多关于如何使用defaultEmtpy的细节?它从源中生成元素,或者,如果源为空,则生成指定的默认值。Ex:Observable.from[].defaultIfEmpty1将产生1。感谢您的输入,我将尝试更改我的代码my.modelService.getBookDetails提供书籍数组,我需要检查并为数组中的所有元素创建房间。我尝试使用concatMap,但没有给出您可以使用的预期结果。concatAll将阵列解包为单独的发射。concatAll不适合我。。可能是我用错了,它抛出的编译错误我不知道你的数据的结构是什么,所以我可以帮助你。好吧,让我再提供一点细节-getBookDetails返回一个json对象{'name':'book-1',项目:[{'name':'P1'},{'name':'P2'},{'name':'P3'}在获得这些细节之后,对于book name和所有的pojrect,我需要检查房间是否存在,如果不存在,我需要创建一个房间。检查和创建房间使用了两个单独的http调用
public createRooms(bookID: string): Observable<any> {
return this.modelService.getBookDetails(bookID)
.concatAll()
.concatMap(book => this.getRoom(book.name))
.concatMap(room => {
if (Object.keys(r).length === 0) {
return Observable...
} else ....
});
}