将可观察物体合并回数组

问题描述:

this.groupChatsSub = CEChats.find({ 
    group: {$in: groupIds} 
}) 
.mergeMap(list => Observable.from(list)) 
.flatMap((chat: any)=> { 
    return this.findLastChatMessage(chat._id, chat.lastMessage).map(lmsgsub=> { 
     console.log('lmsgsub', lmsgsub) 
     if(lmsgsub) { 
      chat.lastMessage = lmsgsub; 
      chat.unseen = !lmsgsub.seenBy.some((x)=>x==this.user._id); 
      if(chat.unseen) { 
       this.groupChatUnseen++; 
      } 
     } else { 
      chat.unseen = false; 
     } 
     return chat; 
    }) 
}) 
// .map((sub)=> { 
// console.log(sub); 
// return sub; 
// }) 
.mergeAll(); 

我试图让我的可观察管道正常工作。将可观察物体合并回数组

的找到我的数据库返回数组

我mergeMap使阵列到阵列观察到这样我就可以在下一步访问数组中的每个对象。

然后我flatMap来处理每一个传递的数组项,调用该方法返回一个可观察到的另一个功能,当我做什么,我需要做的单一对象。

如我所料的正确注释掉地图打印所有单个对象。

我然后尝试再次mergeAll单一的对象转化成一个阵列(这似乎不工作)。

我怎样才能得到所有对象的背面到一个数组? 喊我是使用任何其他类型的地图到位flatMap的? (concatMap和mergeMap双方似乎当我添加它来代替flatMap做同样的事情)

〜编辑

使用Picci的答案从下面我改成了这个,这似乎是合作得非常好了。

this.groupChatsSub = CEChats.find({ 
    group: {$in: groupIds} 
}) 
.mergeMap(listChats => { 
    console.log('listy chats', listChats) 
    let myArrayOfChats = []; 
    let myArrayOfObservables = new Array<any>(); 
    for (let chat of listChats) { 

     console.log('IN TEH FOR EACH'); 
     myArrayOfChats.push(chat); 
     myArrayOfObservables.push(
      this.findLastChatMessage(chat._id, chat.lastMessage).map(lmsgsub=> { 

       console.log('lmsgsub', lmsgsub) 
       if(lmsgsub) { 
       chat.lastMessage = lmsgsub; 
       chat.unseen = !lmsgsub.seenBy.some((x)=>x==this.user._id); 
       if(chat.unseen) { 
        this.groupChatUnseen++; 
       } 
       } else { 
       chat.unseen = false; 
       } 
      }); 
     ); 
    }; 
    return Observable.combineLatest(myArrayOfObservables).map(()=> myArrayOfChats); 
}) 

我认为最终要具有可观察到的,一旦所有的findLastChatMessage已经执行发出的数组。

如果是这样的话,我会尝试沿着这些线路

this.groupChatsSub = CEChats.find({ 
    group: {$in: groupIds} 
}) 
.mergeMap(list => { 
    const myArrayOfChats = []; 
    const myArrayOfObservables = new Array<Observables>(); 
    for (let chat of list) { 
    myArrayOfObservables.push(this.findLastChatMessage(chat._id, chat.lastMessage).map(lmsgsub=> { 
     myArrayOfChats.push(chat); 
     console.log('lmsgsub', lmsgsub) 
     if(lmsgsub) { 
      chat.lastMessage = lmsgsub; 
      chat.unseen = !lmsgsub.seenBy.some((x)=>x==this.user._id); 
      if(chat.unseen) { 
       this.groupChatUnseen++; 
      } 
     } else { 
      chat.unseen = false; 
     } 
    }); 
    return Observable.combineLatest(myArrayOfObservables).map(() => myArrayOfChats); 
    } 
}) 

整个想法是创建一个观测值,比数组的东西,通过combineLatest运营商,获得一个可观察发射一旦所有的观测数组中包含的观测量已经发射。

最后映射运算符用于返回聊天的阵列。

免责声明:我不是完全肯定的代码是正确的,因为我没有建立一个真正的考验,但简单地组装,我认为相关概念

PS:flatMap已更名为mergeMap,所以2运营商是一样的

+0

谢谢,我必须作出一些修改,因为你已经在你的免责声明中说过,但它确实让我走上了正确的道路。 再次感谢:D特别是关于flatMap和mergeMap的提示 –