我对回调不太好,现在我遇到问题,找到一个带有mongoose的文档,但在发送响应之前在同一个动作/控制器中使用该文档。
uploadFile = function(req,res) {
var _objs = {};
function retrieveUser(objs,username, callback) {
User.findOne({ 'username': username })
.exec(function(err, user){
if(err) callback(err,null,null);
else callback(null,user,objs);
});
}//retrieveUser()
retrieveUser(_objs,req.body.user,function(err,user,_objs) {
if(err) console.log('ERROR: ' + err);
_objs.user = user;
console.log(_objs.user);
});
console.log(_objs);
}
因此,在回调函数中,console.log()
正确地显示了对象,但第二个console.log()
显示我_objs
为空。好吧,我需要用其他对象填充_objs
作为属性,我该怎么做才能做到?
答案 0 :(得分:0)
一切都按设计工作。您的代码将按如下方式执行:
retrieveUser(_objs,req.body.user,function(err,user,_objs) {
// will be executed when the retrieveUser function completes is tasks...
if(err) console.log('ERROR: ' + err);
_objs.user = user;
console.log(_objs.user);
});
// ...meanwhile, execution will continue here.
console.log(_objs); // depending on how fast retrieveUser calls the callback, _objs will be set or (more likely) not set.
您可以在回调中继续应用程序的控制流程,也可以使用Streamline.js,async.js,Step,Seq,IcedCoffeeScript等框架, promise.js,...
答案 1 :(得分:0)
这就是我所做的。实际上,我所期望的是类似于我在其他语言的其他框架中的控制器中所做的事情,查询一些实体并创建另一个与之前查询的实体相关的实体。
uploadPic = function(req, res, next) {
var username = req.body.user,
estId = req.body.est;
async.series([
function(callback) {
User.findOne({ 'username': username})
.exec(function(err, user){
if(err) return callback(err);
if(!user) return callback(new Error("No user whit username " + username + " found."));
callback(null,user);
});
},
function(callback) {
Est.findById(estId)
.exec(function(err,est) {
if(err) return callback(err);
if(!est) return callback(new Error("No Est with ID " + estId + " found"));
callback(null,est);
})
},
],function(err,results){
if(err) return next(err);
console.log(results);
/// do my own stuffs here!
});// end async.series()
}