如下面的代码: 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)怎么做呢?
去看看async
async本质还是回调吧
why connect every time
1.你可以保持数据库一直连接 2.如果你觉得一直连接,会消耗性能,可以使用连接池 3.即使不将异步for循环改为同步for循环,依然是有办法判断循环是否结束的
@cony138 是,但是代码结构清晰多了
@danielking 我还以为他需要本质上是同步的方法
async用起来蛮方便的
即使不将异步for循环改为同步for循环,依然是有办法判断循环是否结束的
求解。
//这是我封装后的抽象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的同步阻塞模块,有兴趣可以看看-. -
@XadillaX 异步的方式已经很习惯了