Estoy aprendiendo jQuery y estoy tratando de encontrar un ejemplo de código simple que sondeará una API para una condición. (es decir, solicite una página web cada pocos segundos y procese los resultados)
Estoy familiarizado con cómo hacer AJAX en jQuery, simplemente parece que no puedo encontrar la forma "adecuada" de hacer que se ejecute en un "temporizador".
setTimeout
y otras han usadosetInterval
. ¿Por qué se preferiría uno a otro?setTimeout
dentro del controlador de éxito, sino que encadenaría la llamada ajax con jQuery siempre . Así:$.post('ajax/test.html') .done(function(data) { /* process */ }) .always(function() { setTimeout(doPoll, 5000); });
Aquí hay un artículo útil sobre el sondeo largo (solicitud HTTP de larga duración) usando jQuery. Un fragmento de código derivado de este artículo:
Esto hará la siguiente solicitud solo después de que se haya completado la solicitud ajax.
Una variación de lo anterior que se ejecutará inmediatamente la primera vez que se llame antes de respetar el intervalo de espera / tiempo de espera.
fuente
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); } })();
Desde ES6,
fuente
fuente
setInterval(poll, 5000);
fuente
jQuery.Deferred () puede simplificar la gestión de la secuenciación asincrónica y el manejo de errores.
Este es un enfoque elegante, pero hay algunas trampas ...
then()
que falle inmediatamente, la devolución de llamada debería devolver otro objeto thenable (probablemente otroDeferred
), lo que hacen las líneas sleep y ajax.fuente
initiate_polling
haya completado.new Promise( resolve => setTimeout(resolve,1000) ).then( () => alert("done") )
fuente
Creé un pequeño complemento de JQuery para esto. Puedes probarlo:
https://www.npmjs.com/package/jquerypoll
fuente
Esta solución:
La versión mínima de jQuery es 1.12
fuente