2016-12-12 5 views
0

getメッセージを変更して、まだ取得していないメッセージの差分のみを取得します。だから私は複数のユーザーを持つことになるたびに、私は他の人々のメッセージだけを取得します。デルタを5秒ごとに取得し、それを私がすでに検索した結果に追加したいと思います。角2観測可能な間隔でパラメータを送信する方法 - データフィードを連続的にアップロードする

getMessages(){ 
    let maxMessageId = 0; 
    console.log(this.messages); 
    if(this.messages.length > 0) 
    { 
     maxMessageId = Math.max.apply(Math, this.messages.map(function(message){return message.messageAutoIncreamentId;})); 
    } 
    return Observable.interval(5000) 
     .switchMap(() =>this.http.get(this._domainUrl + 'message?maxMessageId='+ maxMessageId)) 
     .map((response: Response)=>{ 
      const messages = response.json().obj; 
      let transformedMessages : Message[] = []; 
      for(let message of messages) 
      { 
       transformedMessages.push(
        new Message(
           message.content, 
           message.user.firstName , 
           message._id, 
           message.user._id, 
           message.messageAutoIncreamentId) 
       ); 
      } 
      this.messages = transformedMessages; 
      return transformedMessages; 
     }) 
     .catch((error: Response) => { 
      this.errorService.handleError(error.json()); 
      return Observable.throw(error.json()); 
     }); 
} 

ここでの問題は、それがおそらく区間外で初期化されますのでmaxMessageIdは、常に0であるということです。パラメータmaxMessageIdをswitchMapに渡すにはどうすればよいですか?

Rx/Observablesがデータを連続的に引き出すためのより良い方法はありますか?

+1

あなただけの必要最小限にこれを取り除くことはできますか? Btwあなたが "switchMapにパラメータmaxMessageIdを渡す"とはどういう意味ですか?あなたはすでにそれをやっていると思います。 – martin

+0

全範囲を理解するのは最小限です。 maxMessageId = 0; console.log(this.messages); (this.messages.length> 0) { maxMessageId = Math.max.apply(Math、this.messages.map(function(message) } trubleは、maxMessageIdが常に0であることです。データを正しく取得できませんか? –

答えて

1

である彼らは、より良いアクセスすることができますので、私は、関数の外にそれらを動かしました。

今すぐgetMessages()に電話すると、5秒ごとにリクエストが行われ、結果が処理され、メッセージ配列にプッシュバックされます。

あなたがする必要があったのは、maxId計算を実行して観測値内でそれを再実行する必要があるときです。最大値が変更されるようにメッセージ配列を変更します。あなたは限られた配列(transformedMessages)で実行することができましたが、私は主なものの上でそれを再実行しました。これはうまくいくはずです。問題がある場合はお知らせください。

-D

let maxMessageId = 0; 

let messages = []; 

getMessages(){ 
    // initial set of max 
    if(messages.length > 0) 
    { 
     maxMessageId = getMaxId(this.messages); 
    } 
    return Observable.interval(5000) 
     .switchMap(() =>this.http.get(this._domainUrl + 'message?maxMessageId='+ maxMessageId)) 
     .map((response: Response)=>{ 
      const messages = response.json().obj; 
      let transformedMessages : Message[] = []; 
      for(let message of messages) 
      { 
       transformedMessages.push(
        new Message(
           message.content, 
           message.user.firstName , 
           message._id, 
           message.user._id, 
           message.messageAutoIncreamentId) 
       ); 
      } 
      messages = transformedMessages; 
      // this changes the messages value, so we should also change the maxID 
      maxMessageId = getMaxId(messages); 
      return transformedMessages; 
     }) 
     .catch((error: Response) => { 
      this.errorService.handleError(error.json()); 
      return Observable.throw(error.json()); 
     }); 
} 

getMaxId(messageList) { 
    return Math.max.apply(Math, messageList.map(function(message){return message.messageAutoIncreamentId;})); 
} 
+0

そうですね。データの応答更新時に追加されました。 –

0

は、おそらく何をしたいので、リスナーを設定し、あなたの最初の関数は、メッセージを保持するべきではありません

return Observable.interval(5000) 
    .map(() => { 
     if(this.messages.length > 0) { 
     return Math.max.apply(Math, this.messages.map(function(message){return message.messageAutoIncreamentId;})); 
     } else { 
     return 0; 
     } 
    }) 
    .switchMap((maxMessageId) => this.http.get(this._domainUrl + 'message?maxMessageId='+ maxMessageId)) 
    .map((response: Response)=>{ 
     ... 
     this.messages = this.messages.concat(transformedMessages); 
     return transformedMessages; 
    }) 
    .catch((error: Response) => { 
     this.errorService.handleError(error.json()); 
     return Observable.throw(error.json()); 
    }); 
関連する問題