javascript - Javascript 回调和堆栈溢出
问题描述
在处理回调嵌套时,我对 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 个元素的数组,其中 asetTimeout
为 1 ms。该过程在Total time: 148020
(大约 148 秒)内完成,可能是由于昂贵的数组移位和 console.log 调用。在此期间,总内存node
保持不变,因此也没有问题。
推荐阅读
- javascript - 连接地图内的所有值
- java - 如何找到两个集合之间的差异
- java - 在 Java 中获取 systemEnvironment['HOSTNAME']
- javascript - 拖动时全日历显示事件
- javascript - React Context 总是会重新渲染
- batch-file - 7zip 使用批处理文件创建空档案
- sql - 连接两个表并满足条件时如何删除重复行
- html - css网格中的嵌套div在父div之外?
- javascript - 在 JS 中生成均匀分布的随机数
- ios - 当基本字符串包含双引号时,仅针对 Swift 中 UILabel 的特定范围的点击手势不起作用