2017-06-19 18 views
0
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を実行します。これは、observableを返す別の関数を呼び出し、それが単一のオブジェクトに対して行う必要があるときに実行します。

コメントアウトされたマップは、期待どおりにすべての単一のオブジェクトを正しく印刷します。

次に、すべてのオブジェクトを1つの配列に再度マージしようとします(これはうまくいかないようです)。

どのようにオブジェクトをすべてアレイに戻すことができますか? そして、私はflatMapの代わりに他のタイプのマップを使用していますか?私は非常によく動作しているようだどの本にそれを変更し、下からPicciの答えを使用した後、編集

(concatMapとmergeMapの両方が、私が代わりにflatMapのそれを追加まったく同じことを行うように見えます)。

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); 
}) 

答えて

1

私は最終的にあなたがすべて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オペレータ経由して、すべての後に放出する1観測を得ますObservablesの配列に含まれるObservablesが放出されました。

最後のマップ演算子は、チャットの配列を返すために使用されます。

免責事項:私は、私は本当のテストを構築するが、単に私が思うに関連する概念を組み立てていなかったので、コードが正しいことを完全に確認していない

PS:flatMapはmergeMapと改称、その2されています演算子は同じです

+0

あなたの免責条項で述べたとおり、いくつかの変更を加えなければなりませんでしたが、間違いなく正しいパスで私を得ました。 もう一度ありがとう:特にflatMapとmergeMapに関するヒント –

関連する問題