JavaScript回调和堆栈溢出

时间:2018-11-09 12:47:55

标签: javascript node.js callback

在处理回调嵌套时,我对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 :(得分:0)

否,在这种情况下,您不会出现堆栈溢出。这是因为doSomething函数在计划执行后会立即返回。

此外,每个doSomething函数都在同一个request_list对象上操作,每次调用将其大小减小1,直到数组中没有元素为止,因此代码无法运行无限期地。

我试图查看是否可能存在内存问题,所以我将您的示例推到了极限。

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秒)内完成,这可能是由于昂贵的阵列移位和console.log调用所致。在这段时间内node的总内存保持不变,因此也没有任何问题。