Me he encontrado con un problema extraño en Firefox 12. setTimeout() no parece esperar siempre la longitud adecuada. ¿O quizás son los milisegundos de la fecha los que no funcionan?Firefox invoca la función setTimeout demasiado pronto (o Date.getTime() está desactivado?)
Check out this fiddle. Esencialmente, un setTimeout de 100ms parece funcionar entre 80ms y 110ms. Más puedo entender, basado en John Resig's explanation of timers. ¿Pero menos?
Es posible que deba actualizarlo una o dos veces para ver el problema, ya que a veces funciona correctamente en la primera ejecución. Parece funcionar spifftacular en IE y Chrome.
Aquí está el código que estoy utilizando en mi violín:
var txt = '',
TIMEOUT_LENGTH = 100,
_now;
now = Date.now || function() { return new Date().getTime() };
function log(time) {
c = time < 100? 'class="error"' : '';
$('#log').append('<p '+c+'>waited ' + time + '</p>');
}
function defer() {
var d = $.Deferred(),
start = now();
setTimeout(function() {
d.resolve(now() - start);
}, TIMEOUT_LENGTH);
return d.promise();
}
for (var i = 0; i < 20; i++) {
defer().then(log);
}
He aquí una muestra de la salida peculiar:
Aquí está mi información navegador:
Y gracias tan muc h por leer mi pregunta! Espero que alguien pueda arrojar algo de luz sobre esto.
MÁS INFORMACIÓN
trabajé alrededor del problema utilizando setInterval() y comprobando cada incremento para ver si ha transcurrido el tiempo necesario. See this fiddle.
Sin embargo, todavía estoy muy interesado en saber si alguien puede arrojar algo de luz en el origen del problema
Puedo confirmar este comportamiento en Firefox 12 en OS X 10.7. Safari proporciona entre 100 y 105 para mí, Firefox 12 80s-110s para la primera ejecución, las siguientes corridas fueron ... 95-105. – Aaron
Me alegra saber que no soy solo yo :) – Kato
Así que eso es todo lo que tenemos entonces. Tal vez abra un error en Mozilla solo para ver lo que dicen :) – Kato