2010-12-31 19 views
0

私は時折、ページのステータスが最新(基本的にはLiveまたはOffline)であるかどうかを非同期的に確認する必要がある単一のページを持っています。あなたは、ページが最初に読み込まれたときに設定されているvarライブを持つ関数を持っていることがわかります。私は次に、liveのステータスが真であるか偽であるかを取得するためにサーバーにajaxリクエストを行います。私は最初のライブ変数と新しく返されたデータjsonオブジェクトを比較します。それらが同じであれば私は何もしませんが、異なる場合はいくつかのCSSクラスを適用します。再帰的にsetTimeoutで実行します(これを再帰的に行うより良い方法はありますか?)。基本的なAjaxキャッシュの問題

問題: data.liveは、dbで変更されても実行された初期時刻から変更されません。私はそれが最初の負荷で正しい値を返すので、私のmysqlが動作していることを知っています。それはキャッシングの問題のようです。

ご協力いただきまして誠にありがとうございます。

function checkLive() { 
    var live = <?=$result["live"]?>; 

    $.ajax({ 
     type: 'get', 
     url: '/live/live.php', 
     dataType: 'json', 

     success: function(data) { 
      console.log('checking for updates... current:' + data.live); 
      if (data.live == live) { 
       return; 
      } else { 
       var elems = $('div.player_meta, object, h3.offline_message'); 
       if (data.live == '1') { 
        elems.removeClass('offline').addClass('live'); 
       } else { 
        elems.addClass('live').addClass('offline'); 
       } 
      } 
     } 
    }); 

    setTimeout(function() { checkLive() } ,15000); 
} 

checkLive(); 

答えて

5

このように、URLにキャッシュブレーカーを追加するcache option of $.ajax()を使用します。それは、それが解決しない場合は、要求がなされているかどうかを確認し、放火犯を見て...

$.ajax({ 
    type: 'get', 
    url: '/live/live.php', 
    dataType: 'json', 
    cache: false, 
    //success, etc. 
}); 

(それは確かに後にする必要があります)、それがの場合はまだが古い値を得ている場合、問題はPHPであり、JavaScriptではありません。問題に関係のない


、ちょうど側先端:あなたがパラメータを必要としない場合は、匿名関数呼び出しをスキップすることができ、この:

setTimeout(function() { checkLive() } ,15000); 

だけで使用できます

setTimeout(checkLive, 15000); 
+0

ありがとうニックは、私が探していたものです。素晴らしい仕事を! – michaelespinosa

0

URLに一意のIDを追加することで、キャッシュの問題であるかどうかを確認できます。

変更url: '/live/live.php',url: '/live/live.php?'+new Date().getTime(),

乾杯

G.

+0

これは 'cache:false'のやり方です。) –

+0

yep私はjavascript(jQueryなし)の実装には一意のIDを使用していますが、$ .ajaxを使用している場合はキャッシュを使用する:false :)他の誰かが既にそれをしたかどうかを確認する前に私は答えました;)私の悪い –

+0

グレゴリーに感謝、私は他の何かのトンのためにその方法を使用しましたが、何らかの理由で、 – michaelespinosa

0

私はニックCraverは、右の応答を持っていると思います。

あなたはSetTimeoutである質問のもう1つの点として、SetInterval()を使用して再帰呼び出しを避けることができます。しかし、実際には私はsetTimeout()を使い、15000時間の要素を追加します。その要素をcheckliveのパラメータとして設定します。それから、時間の経過と共に徐々に遅れていくような小切手があります。これは48時間以来あなたのページにまだ彼の人からHTTp要求の多くを避けることができます。

ほとんどの場合、ユーザーは定期的に新しいページを確認しますが、非常に長い時間ページに滞在している人は、実際には存在しない可能性があります。ここに私がそのことをしていたコードがあります。

function checkLive(settings) { 
    (...) //HERE ajax STUFF 
    setTimeout(function() { 
     if ((settings.reload <2000000000) && (settings.growingfactor > 1)) { 
      checkLive(settings); 
      settings = jQuery.extend(settings,{reload:parseInt(settings.reload*settings.growingfactor,10)}); 
     } 
    },settings.reload); 
} 
+0

興味深いアイディアregilero。入力をありがとう、私はこれをチェックするつもりです。 – michaelespinosa