Вопрос по node.js – Вызов функции рекурсивно с регулярными интервалами

9

Поэтому мне было интересно, как лучше (с точки зрения роста стека и производительности) рекурсивно вызывать функцию через регулярные промежутки времени? Например, допустим, я хочу читать содержимое файла каждые 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: вызов process.nextTick внутри 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);
})();

Что я хочу знать, так это то, что добавление process.nextTick внутри setTimeout помогает или нет? Будет ли вызов функции внутри process.nextTick облегчать использование стека или нет?

Я не вижу здесь никаких рекурсивных вызовов. Вызов цикла вызывается, когда происходит событие тайм-аута, а не из функции. Он не может быть вызван, пока loop () не вернется jcoder
Не ответить вам, но вы должны обязательно поставитьsetTimeout в обратном вызове вашегоreadFile. Florian Margaine

Ваш Ответ

1   ответ
31

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)
+1 Прекрасный ответ. Я удаляю свою.

Похожие вопросы