Uczę się jQuery i próbuję znaleźć prosty przykład kodu, który będzie sondował API pod kątem warunku. (tzn. żądaj strony internetowej co kilka sekund i przetwarzaj wyniki)
Jestem zaznajomiony z tym, jak robić AJAX w jQuery, po prostu nie mogę znaleźć „właściwego” sposobu na wykonanie tego na „zegarze”.
setTimeout
a niektórzy używalisetInterval
. Dlaczego jeden miałby być preferowany?setTimeout
w programie obsługi sukcesu, ale zamiast tego łańcuch wywołania ajax z jQuery zawsze . W ten sposób:$.post('ajax/test.html') .done(function(data) { /* process */ }) .always(function() { setTimeout(doPoll, 5000); });
Oto pomocny artykuł na temat długiego odpytywania (długo przetrzymywanego żądania HTTP) przy użyciu jQuery. Fragment kodu pochodzący z tego artykułu:
Spowoduje to, że następne żądanie zostanie wykonane dopiero po zakończeniu żądania AJAX.
Odmiana powyższego, która zostanie wykonana natychmiast po pierwszym wywołaniu przed uznaniem interwału oczekiwania / limitu czasu.
źródło
let is_success = false; (function poll() { let timeout = setTimeout(function() { $.ajax({ url: resp.location, type: "GET", success: function(data) { if(YOUR_CONDITION) { is_success=true; } }, dataType: "json", complete: poll, timeout: 2000 }) }, 5000); if(is_success) { console.log("ending poll"); window.clearTimeout(timeout); } })();
Z ES6,
źródło
źródło
setInterval(poll, 5000);
źródło
jQuery.Deferred () może uprościć zarządzanie asynchronicznym sekwencjonowaniem i obsługą błędów.
To eleganckie podejście, ale jest kilka pułapek ...
then()
aby a od razu wypadło , wywołanie zwrotne powinno zwrócić inny obiekt dopuszczalny (prawdopodobnie innyDeferred
), co robią obie linie sleep i ajax.źródło
initiate_polling
zostało ukończone.new Promise( resolve => setTimeout(resolve,1000) ).then( () => alert("done") )
źródło
Stworzyłem w tym celu niewielką wtyczkę JQuery. Możesz spróbować:
https://www.npmjs.com/package/jquerypoll
źródło
To rozwiązanie:
Minimalna wersja jQuery to 1.12
źródło