Saltar al contenido

encontrar el tiempo restante en un setTimeout ()?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *