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.