Rxjs combineAll与双贴图包裹

Rxjs combineAll与双贴图包裹,rxjs,observable,angularfire2,Rxjs,Observable,Angularfire2,我正在使用AngularFire2。我想检索用户聊天列表,并为每个聊天确定是否在用户离开聊天室后发出最后一条消息if 为此,我通过返回FirebaseListObservable的函数getUserChatList()检索聊天列表 看起来我们不能直接在列表上使用map操作符,我们需要对它进行双重映射 完成后,我检索每个聊天的最后一条消息,如果我确定一条消息未读,我将anyUnread变量设置为true 我必须等待每个聊天都已处理,因此我使用combineAll() 看起来我的代码永远不会进入最后

我正在使用AngularFire2。我想检索用户聊天列表,并为每个聊天确定是否在用户离开聊天室后发出最后一条消息if

为此,我通过返回FirebaseListObservable的函数getUserChatList()检索聊天列表

看起来我们不能直接在列表上使用map操作符,我们需要对它进行双重映射

完成后,我检索每个聊天的最后一条消息,如果我确定一条消息未读,我将anyUnread变量设置为true

我必须等待每个聊天都已处理,因此我使用combineAll()

看起来我的代码永远不会进入最后一个映射(return语句)。知道我做错了什么吗

watchUnreadMessages() {
    // Retrieve all chats
    this.subscription =
    this.msgService.getUserChatList()
    .map( chats => {
      chats.map( chat => {
        console.log('chat ', chat)
        let lastPresence = chat.lastPresence;
        return this.msgService.getLastMessage(chat.$key)
        .map( lastMess => {
          console.log('lastMess ', lastMess)
          if (lastMess[0].timestamp >= lastPresence)
          this.anyUnread = true;
        });
      })
    })
    .combineAll( () => {
      let unread = this.anyUnread;
      return unread
    }).subscribe( (unread) => console.log('unread: ', unread) );


  }
*编辑* 试图使用@kit建议的mergMap,这对简单的示例有效,但在我的例子中仍然存在一些阻塞错误

首先尝试简单:

this.msgService.getUserChatList().flatMap( chats =>
      Observable.from(chats).flatMap( (chat, i) => {
            console.log ('chat, ', chat);
            return Observable.of(chat);
      })
      .last()
    )
    .subscribe( () => console.log('Finished') )
它显示chat1、chat2和finished(顺序完美)。请注意,聊天包含$key和lastPresence等属性

现在我想增加复杂性:

this.msgService.getUserChatList()
      .flatMap( chat => {
        return this.msgService.getLastMessage(chat.$key).map( lastMess => {
          return this.containsUnreadMessages(lastMess, chat.lastPresence);
        })
      } )
      .last()
    )
    .subscribe( () => console.log('Finished') )

代码甚至无法编译,因为调试器告诉我,{}类型中不存在属性$key和lastPresence。。。这快把我逼疯了

好吧,虽然这可以做得更好,但也许你会从中获得一些灵感:

const arr = [
    [{timestamp: 1}],
    [{timestamp: 1}],
    [{timestamp: 3}],
];

Rx.Observable.from([
    {lastPresence: 1},
    {lastPresence: 2},
    {lastPresence: 3},
])
.flatMap((chat, i) => {
    return Rx.Observable.of(arr[i]).map((lastMess) => lastMess[0].timestamp >= chat.lastPresence ? 1:0);
})
.scan((counter, one) => counter + one, 0)
.last()
.subscribe((unread) => console.log('unread: ', unread));

当然,您必须在第6行中添加return“return chats.map(chat=>{)”是的,您是对的。我添加了一个return语句(或者只是删除了{})但是仍然要注意显示“lastmesss”…:这确实是一个好的开始。我试图改编您的示例,但在我的示例中,我无法调用chat对象的任何属性…调试器告诉我,该属性在类型{}中不存在。但是我确信这个属性存在,因为如果我只是将对象记录到控制台,我就可以看到它…有什么想法吗?你必须粘贴代码,我的示例只是一个建议。