nodejs如何实现对mongodb的同步操作,非回调的阻塞io
发布于 12 年前 作者 dajibo168 14467 次浏览 最后一次编辑是 8 年前

如下面的代码: tags.forEach(function(tag){ tag.tasks.push(task); con.connect(); tag.save(function(err) { con.disconnect(); if (err) { console.log('编辑失败! '+ err); callback(err); }else console.log(“插入成功”); }); }); 如果非阻塞的io就会出现trying to open a unclosed connection。上一个回调完成释放连接前,下一个连接就请求建立了。 如何把循环变成同步的呢?希望在循环结束后再执行callback(null)怎么做呢?

11 回复

async本质还是回调吧

why connect every time

1.你可以保持数据库一直连接 2.如果你觉得一直连接,会消耗性能,可以使用连接池 3.即使不将异步for循环改为同步for循环,依然是有办法判断循环是否结束的

@cony138 是,但是代码结构清晰多了

@danielking 我还以为他需要本质上是同步的方法

async用起来蛮方便的

即使不将异步for循环改为同步for循环,依然是有办法判断循环是否结束的

求解。

@XadillaX

//这是我封装后的抽象Model
var Dao = require('./Dao');
//这是我根据抽象的Model查找到实体的Model
var professionDao = Dao('profession');
/**
 * 游标函数
 * @param _start 游标的起始位置
 * @param _limit 游标的分页数量
 * @param _callback 游标执行函数
 */
function cursor(_start,_limit,_callback){
  //初始化数据定义
  var start,limit,flag,len;
  //初始化起始位置
  start = !_start || _start < 0 ? 0 : _start;
  //初始化分页数量
  limit = !_limit || _limit < 1 ? 1 : _limit;
  //使用Model执行分页查询
  professionDao.find().skip(start).limit(limit).exec(function(err,docs){
    //缓存长度
    len = docs.length;
    //如果没有查询到,证明已经查询完毕
    if(len === 0){
      console.log('遍历结束');
    }
    //初始化循环结束标记
    flag = 0;
    //遍历
    docs.forEach(function(doc){
      //如果有执行函数就执行
      if(_callback && toString.call(_callback) === '[object Function]'){
        _callback(doc);
      }
      //如果循环到末尾,则迭代
      if(len == ++flag){
        cursor(start + docs.length,limit);
      }
    });
  });
}
cursor(0,10,function(doc){
  console.log(doc._id);
});

@a272121742 话说我用Fibers实现了MongoDB的同步阻塞模块,有兴趣可以看看-. -

http://xcoder.in/blog/2013/03/nodejs-mongodb-sync.xhtml

@XadillaX 异步的方式已经很习惯了

回到顶部