2012-06-20 16 views
8

Więc zastanawiałem się, co jest lepszym sposobem (pod względem wzrostu stosu i wydajności), aby rekursywnie wywoływać funkcję w regularnych odstępach czasu? Na przykład powiedzmy, że chcę czytać zawartość pliku co 200 ms. Mam następujące dwie metody i zastanawiałem się, czy są one inne?Funkcja wywoływania rekursywnie w regularnych odstępach czasu

Metoda 1: Korzystanie zwykły ole setTimeout bez 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); 
})(); 

Metoda 2: Wywoływanie process.nextTick wewnątrz 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); 
})(); 

Co chcę wiedzieć jest to, że dodanie process.nextTick wewnątrz setTimeout pomaga, czy nie? Czy wywołanie funkcji w procesie process.nextTick zmniejszy użycie stosu, czy nie?

+2

Nie odpowiem, ale powinno się umieścić 'setTimeout' w wywołaniu zwrotnym twojego "readFile". –

+1

Nie widzę tu żadnych wywołań rekursywnych. Wywołanie pętli jest wywoływane, gdy następuje zdarzenie timeout, a nie z funkcji. Nie można jej wywołać, dopóki loop() nie zwróci – jcoder

Odpowiedz

28

Nie ma rekurencji w następującym uproszczonym przykładzie:

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

test(); 

wyjście (zauważ, że stos nie rośnie)

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 Perfect odpowiedź. Usuwam moje. –

Powiązane problemy