2010-12-31 9 views
0

Ich habe eine einzelne Seite, die ich gelegentlich überprüfen muss den Server asynchron überprüfen, ob der Status der Seite aktuell (im Grunde, Live oder Offline) ist. Sie werden sehen, dass ich eine Funktion mit einer Var-Phase habe, die beim Laden der Seite festgelegt wird. Ich mache dann eine Ajax-Anfrage an den Server, um herauszufinden, ob der Status von Live wahr oder falsch ist. Ich vergleiche die ursprüngliche Live-Variable mit dem neu zurückgegebenen Daten-JSON-Objekt. Wenn sie gleich sind, tue ich nichts, aber wenn es anders ist, wende ich einige CSS-Klassen an. Ich führe es rekursiv mit setTimeout (gibt es eine bessere Möglichkeit, dies rekursiv zu tun?).Basic Ajax Cache Problem

Mein Problem: data.live ändert sich nicht von seiner ursprünglichen Zeit es läuft auch wenn es in der db geändert hat. Ich weiß, dass mein MySQL funktioniert, weil es den richtigen Wert beim ersten Laden zurückgibt. Es scheint wie ein Caching-Problem.

Jede Hilfe wird sehr geschätzt.

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

Antwort

5

die cache option of $.ajax() Verwenden Sie einen Cache Brecher an die URL anhängen, wie folgt aus:

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

Wenn das es nicht lösen ... bei firebug schauen, ob ein Antrag gestellt wird (Es sollte danach sicher sein), wenn es immer noch einen alten Wert bekommen, ist das Problem in PHP, nicht JavaScript.


kein Zusammenhang mit der Frage, nur eine Seite Tipp: Wenn Sie keine Parameter benötigen, können Sie den anonymen Funktionsaufruf überspringen, dies:

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

kann nur sein:

setTimeout(checkLive, 15000); 
+0

Dank Nick das ist genau das, was ich gesucht habe. Hat super funktioniert! – michaelespinosa

0

Sie können überprüfen, ob es sich um ein Caching-Problem handelt, indem Sie der URL eine eindeutige ID hinzufügen:

ändern Sie url: '/live/live.php', zu url: '/live/live.php?'+new Date().getTime(),

Prost

G.

+0

Dies ist, was 'cache: false' auf eine viel sauberere Weise tut;) –

+0

yep Ich stimme zu, ich habe beide, einzigartige ID für Javascript (ohne jQuery) Implementierung verwendet, aber wenn Sie $ .ajax verwenden, sollten Sie benutze cache: false :) Ich habe geantwortet, bevor ich überprüft habe, ob jemand anderes es schon getan hat;) mein böser –

+0

Danke Gregory, ich habe diese Methode für Tonnen anderer Dinge benutzt, aber aus irgendeinem Grund dachte ich nicht, sie hier zu benutzen. – michaelespinosa

0

denke ich, Nick Craver die richtige Antwort hat.

Für den anderen Punkt der Frage, die Sie SetTimeout sind, könnten Sie SetInterval() verwenden und den rekursiven Aufruf vermeiden. Aber in der Tat würde ich mit einem setTimeout() bleiben und einen Faktor zum 15000 Mal hinzufügen. setze diesen Faktor als Parameter von checklive. Dann haben Sie einen Scheck, der zeitlich verzögert wird. Dies wird eine Menge von HTTp-Anfragen von dem Kerl, der immer noch auf Ihrer Seite seit 48 Stunden.

Wahrscheinlich werden Benutzer regelmäßig nach neuen Seiten suchen, aber jemand, der sich sehr lange auf einer Seite aufhält, ist vielleicht nicht wirklich da. Hier ist ein Code, den ich gemacht habe.

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

Interessante Idee regilero. Danke für die Eingabe, ich werde das überprüfen. – michaelespinosa