mongoose@4.5.2的eachAsync bug

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

原文地址:https://www.cnblogs.com/Kellana/p/6204270.html