在处理回调嵌套时,我对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();
如果请求列表中充满了很多请求,我们是否会发生堆栈溢出?
答案 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
的总内存保持不变,因此也没有任何问题。