2012-06-20 25 views
8

Entonces, me preguntaba ¿cuál es la mejor forma (en términos de crecimiento y rendimiento de la pila) de invocar recursivamente una función a intervalos regulares? Por ejemplo, digamos que quiero leer el contenido del archivo cada 200 ms. Tengo los dos métodos siguientes y me preguntaba si son diferentes.Función de llamada recursiva a intervalos regulares

Método 1: Utilizar oles de civil y sin setTimeout process.nextTick

var fs = require('fs'); 
(function loop() { 
    // Print to time to indicate something is happening 
    console.log(new Date().toString()); 

    // Read a 51MB file 
    fs.readFile('./testfile', function (err, data) { 
    if (err) console.log(err); 
    }); 

    // Call the same function again 
    setTimeout(function() { 
    loop(); 
    }, 200); 
})(); 

Método 2: Llamada process.nextTick dentro setTimeout

var fs = require('fs'); 
(function loop() { 
    // Print to time to indicate something is happening 
    console.log(new Date().toString()); 

    // Read a 51MB file 
    fs.readFile('./testfile', function (err, data) { 
    if (err) console.log(err); 
    }); 

    // Call the same function again 
    setTimeout(function() { 
    process.nextTick(function() { 
     loop(); 
    }); 
    }, 200); 
})(); 

Lo que yo quiero saber es que la adición de process.nextTick interior setTimeout ayuda o no? ¿Llamar a la función dentro de process.nextTick aliviará el uso de la pila o no?

+2

Por no responder, pero que sin duda debe poner el 'setTimeout' en la devolución de llamada de su 'readFile'. –

+1

No veo ninguna llamada recursiva aquí. El bucle de llamada a llamada se invoca cuando ocurre el evento de tiempo de espera, no desde dentro de la función. No se puede invocar hasta que loop() devuelva – jcoder

Respuesta

28

No hay recursividad en el siguiente ejemplo simplificado:

function test() 
{ 
    console.trace(); 
    setTimeout(test, 1000); 
} 

test(); 

salida (tenga en cuenta que la pila no está creciendo)

Trace 
    at test (/private/tmp/rec.js:3:12) 
    at Object.<anonymous> (/private/tmp/rec.js:7:1) 
    at Module._compile (module.js:449:26) 
    at Object..js (module.js:467:10) 
    at Module.load (module.js:356:32) 
    at Function._load (module.js:312:12) 
    at module.js:487:10 
    at EventEmitter._tickCallback (node.js:238:9) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
+0

+1 Respuesta perfecta. Estoy eliminando el mío. –

Cuestiones relacionadas