Нет, в этом случае у вас не будет переполнения стека. Это связано с тем, что функция 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
оставался постоянным, поэтому проблем также нет.