A sondagem com JavaScript é uma daquelas funções feias, mas importantes, das práticas avançadas de teste e experiência do usuário de front-end. Às vezes, não há um evento ao qual você possa se conectar para indicar que uma determinada tarefa foi concluída, então é preciso sujar as mãos e simplesmente fazer uma sondagem. A sondagem com JavaScript não é difícil, mas também não é fácil. Deixe-me mostrar algumas implementações de polling em JavaScript que o senhor pode adicionar à sua caixa de ferramentas!
Com promessas
Desde que o API Promise está implementada em quase todos os navegadores atuais. Aqui está uma implementação de sondagem que a utiliza:
// The polling function function poll(fn, timeout, interval) { var endTime = Number(new Date()) + (timeout || 2000); interval = interval || 100; var checkCondition = function(resolve, reject) { // If the condition is met, we're done! var result = fn(); if(result) { resolve(result); } // If the condition isn't met but the timeout hasn't elapsed, go again else if (Number(new Date()) 0; }, 2000, 150).then(function() { // Polling done, now do something else! }).catch(function() { // Polling timed out, handle the error! });
O código é estruturado de forma fácil de ler, mas é composto principalmente de três partes: a função condicional que sinaliza o sucesso da sondagem, uma falha condicional que não atingiu o tempo limite, portanto, executaremos novamente, ou uma falha que ultrapassou o tempo limite e deve retornar um erro.
Sem Deferreds
Se o senhor não estiver usando Deferreds, não se preocupe: o polling é praticamente o mesmo:
function poll(fn, callback, errback, timeout, interval) { var endTime = Number(new Date()) + (timeout || 2000); interval = interval || 100; (function p() { // If the condition is met, we're done! if(fn()) { callback(); } // If the condition isn't met but the timeout hasn't elapsed, go again else if (Number(new Date()) < endTime) { setTimeout(p, interval); } // Didn't match and too much time, reject! else { errback(new Error('timed out for ' + fn + ': ' + arguments)); } })(); } // Usage: ensure element is visible poll( function() { return document.getElementById('lightbox').offsetWidth > 0; }, function() { // Done, success callback }, function() { // Error, failure callback } );
A diferença aqui é que não há valor de retorno: as funções de retorno de chamada tomam o lugar da instância Deferred.
A sondagem não é necessariamente uma consequência da codificação assíncrona, mas seu uso e importância definitivamente aumentaram devido ao nosso desejo de escrever código assíncrono. Durante o tempo em que escrevi testes funcionais de front-end com a estrutura de testes Intern, usei bastante a sondagem, tanto no servidor quanto no cliente. Essa técnica sempre terá seu lugar, portanto, certifique-se de ter um snippet como esse disponível.