condição indicador corrida movimentada em Javascript
-
23-08-2019 - |
Pergunta
Eu tenho o seguinte código (javascript / jQuery) para mostrar um indicador de ocupado (depois de um atraso) enquanto uma imagem é de carregamento:
function imgUpdate(arg) {
var loaded = false;
$("#image").one("load", function(){
loaded = true;
$("#busyIndicator").hide();
});
setTimeout(function(){
if (!loaded) {
$("#busyIndicator").show();
}
}, 250);
$("#image")[0].src = arg;
}
Às vezes, o indicador aparece e permanece acima. Como isso é possível se o motor JavaScript do navegador é single-threaded? (Este é no Firefox 3, pela maneira.)
Uma nota:. Isto parece acontecer quando a imagem que está sendo carregado já está em cache
Outra nota:. Se eu fizer logon para o meu console do Firebug, todas as linhas em imgUpdate são executados, mas uma mensagem de log dentro do manipulador onload nunca imprime em chamadas subseqüentes para imgUpdate
Solução 3
Apagar tag src da imagem parece para corrigir o problema:
function imgUpdate(arg) {
var loaded = false;
$("#image").one("load", function(){
loaded = true;
$("#busyIndicator").hide();
});
setTimeout(function(){
if (!loaded) {
$("#busyIndicator").show();
}
}, 250);
$("#image")[0].src = "";
$("#image")[0].src = arg;
}
Outras dicas
Existe algum outro javascript na página que breaks? Se assim for, isso pode não ser uma condição de corrida - JS poderia simplesmente parar a execução antes do busyIndicator está escondido novamente ...
Estou muito pressionado para replicar isso.
Aqui é a implementação de que você está fazendo:
A versão usando o cache: http://jsbin.com/uwuho
Uma versão com cache sendo impedidos: (usos parâmetro para caching evitar) http://jsbin.com/oguvi
Hit F5 / Ctrl-F5 para vê-lo ir. (Em especial com a versão que Evita cache)
Com ou sem cache nenhuma versão está fazendo o que você descreveu.
Seu problema provavelmente está em outro lugar.
Você pode querer limpar o tempo de espera em seu retorno para que ele não vai a incêndios, se a imagem é carregada.
var timer = null;
function imgUpdate(arg) {
var loaded = false;
timer = setTimeout(function(){
$("#busyIndicator").show();
timer = null;
}, 250);
$("#image").one("load", function(){
if (timer) {
clearTimeout(timer);
timer = null;
}
$("#busyIndicator").hide();
});
$("#image")[0].src = arg;
}