【问题标题】:Use of rxjs withLatestFrom functionrxjs withLatestFrom 函数的使用
【发布时间】:2017-07-29 11:41:14
【问题描述】:

尝试执行以下应该执行的代码:

  • 检索用户的所有聊天列表
  • 检索所有这些聊天的最后一条消息
  • 检索所有这些聊天的收件人信息
  • 将所有内容合并为一个数组,其中每个项目是聊天、最后一条消息和收件人信息的组合

     this.msgService.getUserChatList(this.uid).do((chats) => {
        this.chats = [];
        if (!(chats.length > 0))
          this.loading = false;
        this.getLastMessages$ = this.getLastMessagesForChats(chats);
        this.getRecipients$ = this.getRecipientsForChats(chats);
    }).switchMap( chats => Observable.from(chats) ).withLatestFrom(
       this.getLastMessages$,
       this.getRecipients$,
       (chat, lastMessages, recipients) => ({
         chat: chat,
         last: lastMessages[chat['id']],
         recipient: recipients[chat['id']]
        })
    ).subscribe( chats => {
      console.log('chats ', chats);
      this.chats.push(chats);
      this.loading = false;
    });
    

附加功能

getLastMessagesForChats(chats: any): Observable<any[]> {
    let lastMessages$ = [];
    for (let chat of chats) {
      let obs = this.msgService.getLastMessage(chat.id)
        .map( last => ({chat: chat.id, last: last}) );
      lastMessages$[chat.id] = obs;
    }
    return Observable.from(lastMessages$).merge().toArray();
  }

  getRecipientsForChats(chats: any): Observable<any[]> {
    let recipients$ = [];
    for (let chat of chats) {
      let obs = this.userService.getUserPublicInfo(chat.recipient)
        .map( recipient => ({chat: chat.id, recipient: recipient}) );
      recipients$[chat.id] = obs;
    }
    return Observable.from(recipients$).merge().toArray();
  }

我收到以下错误

Uncaught (in promise): TypeError: Cannot read property 'subscribe' of undefined
    TypeError: Cannot read property 'subscribe' of undefined

我找不到出了什么问题...我试图在下面重现JSBIN

有什么想法吗?

【问题讨论】:

    标签: rxjs observable rxjs5


    【解决方案1】:

    链是自下而上构建的。这意味着订单是subscribe() -> withLatestFrom -> switchMap -> do

    因此,在withLatestFrom 尝试订阅getLastMessages$getRecipients$ 时,它们是undefined,因为它们仅在从do() 中发生的源 Observable 传播第一个值之后才被分配。

    编辑:

    // Execution
    getLastMessages$ = Rx.Observable.of(1);
    getRecipients$ = Rx.Observable.of(2);
    chats = [];
    
    getUserChatList('uC')
      .do( (chats) => {
        getLastMessages$ = getLastMessagesForChats(chats);
        getRecipients$ = getRecipientsForChats(chats);
      } )
      .switchMap( chats => Rx.Observable.from(chats) )
      .withLatestFrom(
        getLastMessages$,
        getRecipients$,
        (chat, lastMessages, recipients) => ({
            chat: chat,
            last: lastMessages[chat['id']],
            recipient: recipients[chat['id']]
          }))
      .subscribe( c => {
        console.log('chats ', c);
        chats.push(c);
      });
    

    http://jsbin.com/sulatar/3/edit?js,console

    【讨论】:

    • 我实际上尝试使用以下代码 this.getLastMessages$ = new Observable&lt;any[]&gt;(); this.getRecipients$ = new Observable&lt;any[]&gt;(); 初始化 getLastMessages$ 和 getRecipients$ 但问题仍然存在。知道我怎样才能做到这一点吗?
    • @ManuelRODRIGUEZ 查看我的更新,这显然不会产生您想要的结果,但您可以看到它有效
    • 你没有更多的错误,谢谢,但我不明白为什么withLatestFrom 调用会产生未定义。有什么想法吗?
    • @ManuelRODRIGUEZ 它不会产生undefined。在withLatestFrom 尝试订阅时,两个源 Observable 是 undefined
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多