如下面的代码: 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 回复
//这是我封装后的抽象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);
});