定期recursion调用函数
所以我想知道什么是更好的方式(在堆栈增长和性能方面)以recursion方式定期调用一个函数? 例如,假设我想每200毫秒读取文件内容。 我有以下两种方法,并想知道他们是否有什么不同?
方法1:使用普通的ols 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); })();
方法2:调用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 () { process.nextTick(function () { loop(); }); }, 200); })();
我想知道的是,在setTimeout中添加process.nextTick是否有帮助? 调用process.nextTick中的函数是否会缓解堆栈使用情况?
以下简化示例中没有recursion:
function test() { console.trace(); setTimeout(test, 1000); } test();
输出(注意堆栈不增长)
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)