2016-08-22 27 views
-1

私のページには、ユーザーが持っている未読メッセージの数を示す電子メールボタンがあります。 未読メッセージの数を返すエンドポイントがあります。html5でsetinterval関数を使用するWebワーカーがサーバーをポーリングする

ユーザーがページ全体を更新しなくても、メッセージの数をリフレッシュしたいと考えています。

私は、新しいメッセージがある場合、html5ウェブワーカーでsetIntervalを使用して10秒ごとにエンドポイントを呼び出し、それに応じてUIを更新することを考えています。

このようなアプローチの欠点は何ですか?そのようなことを実装するためのより良い方法があれば?

答えて

1

私はこのアプローチに "詐欺"はありません。 mainJSが中断されないように、別のスレッドで実行されます。しかし、正しいエラー処理を実装することを確認してください!予期せぬことが起こった場合は、closeとしたいと思います。ここで

は、私は似た何かをしたwebworker JSファイルの例です:

function checkStatus() { 
    var ajaxRequest = new XMLHttpRequest(); 
    ajaxRequest.onreadystatechange = function() { 
     if(ajaxRequest.readyState == 4) { 
      self.postMessage(ajaxRequest.responseText); 
      var timer; 
      timer = self.setTimeout(function(){ 
       checkStatus(); 
      }, 10000); // 10 seconds 
     } 
    } 

    var queryString = "?"; // hand over i.e. a userID 
    ajaxRequest.open("GET", "/statusCheck.php"+queryString, true); 
    ajaxRequest.send(null); 
} 

this.onmessage = function(e){ 
    checkStatus(); 
}; 

これは非常に単純化しています。私のmainJSからのメッセージには、たとえばuserIDやその他の変数が含まれているので、GETまたはPOST引数としてstatusCheck.phpに渡すことができます。 JSON形式の文字列をPHPの応答として使用することをお勧めします。ここでは、ユーザーのメール数を取得します。 self.postMessage()あなたのmainJSに手を戻し、あなたが好きなものを手にすることができます。 :)

0

私はこのことに悪いことがあると思う...複雑です。 Webワーカーなしで行うことができます.Ajaxリクエストを発生させることは、ユーザーがUIに中断することなく、メインスレッドで実行できることです。これは、好きな場合にポーリングを含みます。

唯一の例外は、応答がメインスレッドで多少の処理をトリガし、一時的にハングアップし、ユーザーが気づいた場合です。しかし、サーバーからの小さな応答を処理すると、私はこのカテゴリに入ることはないと考えています。

また、ブラウザはウェブワーカーを殺すことを決定できます。あなたのソリューションをメインスレッドのajax呼び出しと同等に堅牢にするには、それを再作成する方法を実装する必要があります。だから、もっとコードを書いて維持することが...

関連する問題