Обратные вызовы Javascript и переполнение стека - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть сомнения по поводу поведения NodeJS / Javascript при работе с вложением обратных вызовов.

У меня есть следующий (упрощенный) код в приложении NodeJS:

var request_list = [];

function doSomething(){
  if(request_list.length > 0){
    let r = request_list.shift();

    // Do something with r

    setTimeout( ()=> {doSomething()}, 1000);
  }
}

doSomething();

Еслисписок запросов заполнен множеством запросов. Можем ли мы переполнить стек?

1 Ответ

0 голосов
/ 09 ноября 2018

Нет, в этом случае у вас не будет переполнения стека. Это связано с тем, что функция doSomething возвращается сразу после планирования самого выполнения.

Кроме того, каждая функция doSomething работает с одним и тем же объектом request_list, уменьшая его размер на единицу при каждом вызове до тех пор, пока в массиве не останется элемент, так что код не может выполняться бесконечно.

Я попытался выяснить, может ли быть проблема с памятью, поэтому я довел ваш пример до предела.

var request_list = new Array(10000).fill("a")
var start = Date.now();

function doSomething(){
  if(request_list.length > 0){
    let r = request_list.shift();

    console.log(r);
    // Do something with r

    setTimeout( ()=> {doSomething()}, 1);
  }
}

doSomething();

process.on('exit', () => { console.log('Total time: ' + (Date.now() - start))})

Я создал массив из 10000 элементов с setTimeout, равным 1 мс. Процесс завершился за Total time: 148020 (около 148 секунд), возможно, из-за дорогостоящих вызовов shift и console.log. В течение этого времени общий объем памяти node оставался постоянным, поэтому проблем также нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...