我正在尝试使用mongoose将某些内容保存到数据库中。事情是我需要确保在我继续执行程序并关闭连接之前完成保存。我知道在mongoose中保存是异步的,我尝试使用这段代码:
saveFunction = function(song){
song.save(function(err, userObj){
if(err){
console.log('Error' + err);
} else{
console.log('saved successfully:', userObj);
}
});
};
database.prototype.add= function(newSong){
mongoose.connect(url);
var song = new songModel({id : newSong.getId(),
title : newSong.getTitle(),
artist : newSong.getArtist,
genre : newSong.getGenre(),
rating : newSong.getRating(),
link : newSong.getLink()});
console.log("before async");
async.parallel([function (callback){
saveFunction(song);
callback();
}],function(){
mongoose.connection.close();
console.log('closed connection');
});
console.log("after async");
nextFreeId++;
};
^ songModel是全局定义的。
我尝试了很多不同的方法并改变了很多东西,但我总是得到某些人的错误。使用此代码,我得到一个process.nexttick(function()throw err)错误。我无法让它发挥作用。有人能告诉我什么是错的或给我提供工作代码吗?
我认为最佳控制台应如下所示:
before async
saved successfully
closed connection
after async
谢谢!
编辑:打开异步的其他替代方案。我只想让这段代码以任何可能的方式工作。我只需要保存/找到一些/删除的东西,它需要等待程序的其余执行,直到保存/查找/删除完成。我变得非常绝望,在一个紧张的事情上单独失去了近一天这个问题:(
答案 0 :(得分:2)
您需要从保存功能返回回调。
saveFunction = function(song,callback){
song.save(function(err, userObj){
if(err){
console.log('Error' + err);
return callback(true,err)
} else{
console.log('saved successfully:', userObj);
return callback(null);
}
});
};
修改强>
从您的评论中,您期望的行为永远不会发生。你期待
console.log("before async");
async.parallel -> do your bits
console.log('closed connection');
console.log("after async");
然而,这永远不会发生,因为async.parallel
是一个异步调用,这意味着执行不会等待让它完成,然后再转移到下一个命令。你看到的行为是
console.log("before async");
async.parallel -> starts
console.log("after async");
async.parallel -> console.log('closed connection');
节点正在执行第一个日志,启动async.parallel
,然后是console.logging"在async"之后。然后,当async.parallel
进入其回调函数时,它会打印"关闭连接",因此它出现在" async"之后因为它是在之后执行的。
您要执行的任何逻辑依赖于async.parallel
的结果必须在回调函数中发生。此外,当您想要异步运行2个或更多函数时使用async.parallel
,然后在它们全部完成后执行回调。您的解决方案不需要async.parallel。您可以将其替换为:
saveFunction(song,function(err){
if(err){
//failed to save song
}
mongoose.connection.close(); //you do not need to do this anyway
console.log('closed connection');
nextFreeId++;
//anything else you need to do here
});