gpt4 book ai didi

Javascript 回调和堆栈溢出

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:05 25 4
gpt4 key购买 nike

我对 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();

如果请求列表填满了很多请求,会不会出现堆栈溢出?

最佳答案

不,在这种情况下不会出现堆栈溢出。这是因为 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 毫秒。该过程在总时间:148020(大约 148 秒)内完成,可能是由于昂贵的数组移位和 console.log 调用。在此期间,node 的总内存保持不变,因此也没有问题。

关于Javascript 回调和堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53225997/

25 4 0