mongoose@4.5.2的eachAsync bug
2024-09-01 21:46:06
自称踩坑大王,幸好没有地雷,哈哈哈哈哈哈,今天用了mongoose的 eachAsync() 方法,没想到,会出现 Trace: [RangeError: Maximum call stack size exceeded]这个错误,为什么呢?
代码所示,采用了递归的方式进行游标操作的,在每次handleNextResult递归之前,原来的doc 没有释放,还是压在栈里面,因此,会出现栈溢出的情况。此时我很郁闷。
QueryCursor.prototype.eachAsync = function(fn, callback) {
var Promise = PromiseProvider.get();
var _this = this; var handleNextResult = function(doc, callback) {
var promise = fn(doc);
if (promise && typeof promise.then === 'function') {
promise.then(
function() { callback(null); },
function(error) { callback(error); });
} else {
callback(null);
}
}; var iterate = function(callback) {
return _next(_this, function(error, doc) {
if (error) {
return callback(error);
}
if (!doc) {
return callback(null);
}
handleNextResult(doc, function(error) {
if (error) {
return callback(error);
}
iterate(callback);
});
});
}; return new Promise.ES6(function(resolve, reject) {
iterate(function(error) {
if (error) {
callback && callback(error);
return reject(error);
}
callback && callback(null);
return resolve();
});
});
};
当我准备提交到mongoose的git上面的时候,发现mongoose的最新的版本不是这样的,查看了新版本的mongoose,他用了setTimeout,这就意味者他在进入下一个递归的时候就另外起了一个新的线程,保证把stack清除。
setTimeout(function() {
iterate(callback);
}, 0);
最新文章
- Javascript闭包和C#匿名函数对比分析
- Vsphere初试——基本安装
- Docker容器操作中常用命令集合
- 手动安装python后,交互模式下退格键乱码
- ( 转)基于.NET平台常用的框架整理
- Project Euler 106:Special subset sums: meta-testing 特殊的子集和:元检验
- JSTL之迭代标签库
- linux shell突然显示-bash-4.1#的解决方法
- Spring源代码解析(收藏)
- Template 使用注意问题和范例
- AC自动机修正
- Android - 支持不同的设备
- 修改6S Fortran77 代码,建立查找表
- vue 二三倍图适配,1像素边框
- java.lang.NoSuchMethodError: org.apache.curator.framework.api.CreateBuilder.creatingParentsIfNeeded()Lorg/apache/curator/framework/api/ProtectACLCreateModeStatPathAndBytesable;
- .NET零基础入门09:SQL必知必会
- ASP代码审计学习笔记 -5.文件下载漏洞
- 快速可靠网络传输协议 KCP(转)
- Hyper-V如何应用新的网卡
- [转]各种编码ANSI、GB2312、GBK、GB18030、UNICODE以及UTF-8傻傻分不清!