将可观察物体合并回数组
问题描述:
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运营商是一样的
谢谢,我必须作出一些修改,因为你已经在你的免责声明中说过,但它确实让我走上了正确的道路。 再次感谢:D特别是关于flatMap和mergeMap的提示 –