Angular 可观察的fork-join不起作用

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

H、 我在正确使用rxJs observable时遇到问题。我的要求是,如果聊天室不可用,则在一本书上创建一个新的聊天室 我正在使用下面的代码,聊天组件中的observable从未被调用

我的聊天组件

@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 ....

        });
}