Antworten:
Wie andere bereits betont haben, werden setInterval und setTimeout den Trick machen. Ich wollte eine etwas fortgeschrittenere Technik hervorheben, die ich aus diesem hervorragenden Video von Paul Irish gelernt habe: http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/
Für periodische Aufgaben, die möglicherweise länger als das Wiederholungsintervall dauern (wie eine HTTP-Anforderung bei einer langsamen Verbindung), ist es am besten, sie nicht zu verwenden setInterval(). Wenn die erste Anforderung nicht abgeschlossen ist und Sie eine andere starten, kann es vorkommen, dass Sie mehrere Anforderungen haben, die gemeinsam genutzte Ressourcen verbrauchen und sich gegenseitig verhungern lassen. Sie können dieses Problem vermeiden, indem Sie warten, bis die letzte Anforderung abgeschlossen ist:
// Use a named immediately-invoked function expression.
(function worker() {
$.get('ajax/test.html', function(data) {
// Now that we've completed the request schedule the next one.
$('.result').html(data);
setTimeout(worker, 5000);
});
})();
Der Einfachheit halber habe ich den Erfolgsrückruf für die Planung verwendet. Die Kehrseite davon ist, dass eine fehlgeschlagene Anforderung Aktualisierungen stoppt. Um dies zu vermeiden, können Sie stattdessen den vollständigen Rückruf verwenden:
(function worker() {
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
},
complete: function() {
// Schedule the next request when the current one's complete
setTimeout(worker, 5000);
}
});
})();
Ja, Sie können entweder die JavaScript- setTimeout()Methode oder die JavaScript- Methode setInterval()verwenden, um den Code aufzurufen, den Sie ausführen möchten. So können Sie es mit setTimeout machen:
function executeQuery() {
$.ajax({
url: 'url/path/here',
success: function(data) {
// do something with the return value here if you like
}
});
setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}
$(document).ready(function() {
// run the first time; all subsequent calls will take care of themselves
setTimeout(executeQuery, 5000);
});
Ich habe den folgenden Code ausprobiert:
function executeQuery() {
$.ajax({
url: 'url/path/here',
success: function(data) {
// do something with the return value here if you like
}
});
setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}
$(document).ready(function() {
// run the first time; all subsequent calls will take care of themselves
setTimeout(executeQuery, 5000);
});
Dies funktionierte für das angegebene Intervall nicht wie erwartet, die Seite wurde nicht vollständig geladen und die Funktion wurde kontinuierlich aufgerufen. Es ist besser, setTimeout(executeQuery, 5000);draußen executeQuery()in einer separaten Funktion wie unten aufzurufen.
function executeQuery() {
$.ajax({
url: 'url/path/here',
success: function(data) {
// do something with the return value here if you like
}
});
updateCall();
}
function updateCall(){
setTimeout(function(){executeQuery()}, 5000);
}
$(document).ready(function() {
executeQuery();
});
Dies funktionierte genau wie beabsichtigt.