Estou aprendendo jQuery e estou tentando encontrar um exemplo de código simples que pesquisará uma API para uma condição. (ou seja, solicite uma página da web a cada poucos segundos e processe os resultados)
Estou familiarizado com como fazer AJAX em jQuery, mas não consigo encontrar a maneira "adequada" de fazê-lo executar em um "cronômetro".
setTimeout
e outras usaramsetInterval
. Por que um seria preferido ao outro?setTimeout
no manipulador de sucesso, mas em vez disso, encadear a chamada ajax com jQuery sempre . Assim:$.post('ajax/test.html') .done(function(data) { /* process */ }) .always(function() { setTimeout(doPoll, 5000); });
Aqui está um artigo útil sobre long polling (solicitação HTTP demorada) usando jQuery. Um snippet de código derivado deste artigo:
Isso fará a próxima solicitação somente após a conclusão da solicitação ajax.
Uma variação do anterior que será executada imediatamente na primeira vez que for chamada, antes de honrar o intervalo de espera / tempo limite.
fonte
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); } })();
De ES6,
fonte
fonte
setInterval(poll, 5000);
fonte
jQuery.Deferred () pode simplificar o gerenciamento de sequenciamento assíncrono e tratamento de erros.
Esta é uma abordagem elegante, mas existem algumas pegadinhas ...
then()
para cair imediatamente, o callback deve retornar outra thenable objeto (provavelmente outroDeferred
), que o sono e linhas ajax tanto faz.fonte
initiate_polling
executado até a conclusão.new Promise( resolve => setTimeout(resolve,1000) ).then( () => alert("done") )
fonte
Criei um pequeno plugin JQuery para isso. Você pode tentar:
https://www.npmjs.com/package/jquerypoll
fonte
Esta solução:
A versão mínima do jQuery é 1.12
fonte