zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    约束constraint
    多表查询
    多表关系
    vue 页面跳转的两种方式
    Java三大特性
    如何搭建vue搭建手脚架(vue-cli 3.0以上版本)
    Mysql高版本不兼容group by解决方案
    springboot整合shiro 报 This application has no explicit mapping for /error, so you are seeing this as a fallback. 错误
    使用Springboot整合redis与mysql
    Springboot登录拦截器
  • 原文地址:https://www.cnblogs.com/Kellana/p/6204270.html
Copyright © 2011-2022 走看看