自称踩坑大王,幸好没有地雷,哈哈哈哈哈哈,今天用了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);

最新文章

  1. Javascript闭包和C#匿名函数对比分析
  2. Vsphere初试——基本安装
  3. Docker容器操作中常用命令集合
  4. 手动安装python后,交互模式下退格键乱码
  5. ( 转)基于.NET平台常用的框架整理
  6. Project Euler 106:Special subset sums: meta-testing 特殊的子集和:元检验
  7. JSTL之迭代标签库
  8. linux shell突然显示-bash-4.1#的解决方法
  9. Spring源代码解析(收藏)
  10. Template 使用注意问题和范例
  11. AC自动机修正
  12. Android - 支持不同的设备
  13. 修改6S Fortran77 代码,建立查找表
  14. vue 二三倍图适配,1像素边框
  15. java.lang.NoSuchMethodError: org.apache.curator.framework.api.CreateBuilder.creatingParentsIfNeeded()Lorg/apache/curator/framework/api/ProtectACLCreateModeStatPathAndBytesable;
  16. .NET零基础入门09:SQL必知必会
  17. ASP代码审计学习笔记 -5.文件下载漏洞
  18. 快速可靠网络传输协议 KCP(转)
  19. Hyper-V如何应用新的网卡
  20. [转]各种编码ANSI、GB2312、GBK、GB18030、UNICODE以及UTF-8傻傻分不清!

热门文章

  1. iOS开发之 -- 判断tableview/scrollview的滑动方法,及导航栏渐变的实现代码
  2. redis问题集
  3. 关于sqlSessionTemplate
  4. AtomicInteger保证线程安全的全局变量
  5. boost::interprocess(1)
  6. shell学习之路(整理ing)
  7. OpenvSwitch2.4.0源码解读
  8. JavaScript dotAll模式
  9. T-SQL with关键字 with as 递归循环表
  10. OVN实战---《A Primer on OVN》翻译