Solución:
Solo para que conste, hay una manera de obtener el tiempo restante en node.js:
var timeout = setTimeout(function() {}, 3600 * 1000);
setInterval(function() {
console.log('Time left: '+getTimeLeft(timeout)+'s');
}, 2000);
function getTimeLeft(timeout) {
return Math.ceil((timeout._idleStart + timeout._idleTimeout - Date.now()) / 1000);
}
Huellas dactilares:
$ node test.js
Time left: 3599s
Time left: 3597s
Time left: 3595s
Time left: 3593s
Esto no parece funcionar en firefox, pero dado que node.js es javascript, pensé que este comentario podría ser útil para las personas que buscan la solución de nodo.
EDITAR: De hecho, creo que hice uno aún mejor: https://stackoverflow.com/a/36389263/2378102
Escribí esta función y la uso mucho:
function timer(callback, delay) {
var id, started, remaining = delay, running
this.start = function() {
running = true
started = new Date()
id = setTimeout(callback, remaining)
}
this.pause = function() {
running = false
clearTimeout(id)
remaining -= new Date() - started
}
this.getTimeLeft = function() {
if (running) {
this.pause()
this.start()
}
return remaining
}
this.getStateRunning = function() {
return running
}
this.start()
}
Haz un temporizador:
a = new timer(function() {
// What ever
}, 3000)
Entonces, si quieres el tiempo restante, haz lo siguiente:
a.getTimeLeft()
Si no puede modificar el código de la biblioteca, deberá redefinir setTimeout para que se adapte a sus propósitos. Aquí tienes un ejemplo de lo que podrías hacer:
(function () {
var nativeSetTimeout = window.setTimeout;
window.bindTimeout = function (listener, interval) {
function setTimeout(code, delay) {
var elapsed = 0,
h;
h = window.setInterval(function () {
elapsed += interval;
if (elapsed < delay) {
listener(delay - elapsed);
} else {
window.clearInterval(h);
}
}, interval);
return nativeSetTimeout(code, delay);
}
window.setTimeout = setTimeout;
setTimeout._native = nativeSetTimeout;
};
}());
window.bindTimeout(function
window.setTimeout(function () {console.log("All done.");}, 1000);
Este no es un código de producción, pero debería ponerlo en el camino correcto. Tenga en cuenta que solo puede vincular un oyente por tiempo de espera. No he realizado pruebas exhaustivas con esto, pero funciona en Firebug.
Una solución más robusta usaría la misma técnica de empaquetar setTimeout, pero en su lugar usaría un mapa del timeoutId devuelto a los oyentes para manejar múltiples oyentes por tiempo de espera. También puede considerar ajustar clearTimeout para que pueda desconectar a su oyente si se borra el tiempo de espera.