我正试图向视图发送来自多个模型的信息,如下所示:
var tareasGlob = "";
var directoresProy = "";
var usuariosGlob = "";
var proyectosGlob = "";
module.exports = {
'index' : function(req, res, next){
// De esta forma se utlisaria la funcion de utilidad que cree en el archivo /api/services/utility.js
// utility.sliceIt();
Tarea.find().done(function(err, tareas){
if(err){ return res.serverError(err); }
tareasGlob = tareas;
});
console.log('tareas', tareasGlob);
DirectorProy.find().done(function(err, directsproy){
if(err){ return res.serverError(err); }
directoresProy = directsproy;
});
Usuario.find().done(function(err, usuarios){
if(err){ return res.serverError(err); }
usuariosGlob = usuarios;
});
Proyecto.find().done(function(err, proyectos){
if(err){ return res.serverError(err); }
proyectosGlob = proyectos;
});
res.view({
'tareas' : tareasGlob,
'directoresproy' : directoresProy,
'usuarios' : usuariosGlob,
'proyectos' : proyectosGlob
});
},
,但随后发生错误,因为当我做"res.view()"还没有赋值给变量,并且是空的。
提前感谢您对我改正这个问题的帮助
有一些节点包可以帮助您解决像这样的异步编码问题。Sails将异步库全球化,这将允许您将代码重写为:
// All four of the functions inside `async.auto` will run in parallel,
// and if successful their results will be passed to the "allDone"
// function
async.auto({
tareas: function(cb) {
Tarea.find().exec(cb);
},
directsproy: function(cb) {
DirectorProy.find().exec(cb);
},
usuarios: function(cb) {
Usuario.find().exec(cb);
},
proyectos: function(cb) {
Proyecto.find().exec(cb);
}
}, function allDone(err, results) {
// If any of the functions called the callback with an error,
// allDone will immediately be called with the error as the
// first argument
if (err) {return res.serverError(err);}
// Otherwise, `results` will be an object whose keys are the
// same as those of the first argument (tareas, directsproy,
// usuarios and proyectos, and whose values are the results
// of their `find` queries.
res.view(results);
});
你也可以使用async.auto
来声明不同函数之间的依赖关系,使用async.forEach
来对数组进行异步循环,以及各种有趣的东西。
您必须确保在调用res.view之前所有4个查找方法都已完成。我会说有一个计数器跟踪你收到了多少响应,每次有响应返回时都加1。然后将res.view移动到一个方法中,该方法检查var == 4,如果没有返回。
类似于(可能是下面的错误):
'index' : function(req, res, next){
var counter = 0;
// De esta forma se utlisaria la funcion de utilidad que cree en el archivo /api/services/utility.js
// utility.sliceIt();
Tarea.find().done(function(err, tareas){
if(err){ return res.serverError(err); }
tareasGlob = tareas;
counter++;
this.returnView(res);
});
console.log('tareas', tareasGlob);
DirectorProy.find().done(function(err, directsproy){
if(err){ return res.serverError(err); }
directoresProy = directsproy;
counter++;
this.returnView(res);
});
Usuario.find().done(function(err, usuarios){
if(err){ return res.serverError(err); }
usuariosGlob = usuarios;
counter++;
this.returnView(res);
});
Proyecto.find().done(function(err, proyectos){
if(err){ return res.serverError(err); }
proyectosGlob = proyectos;
counter++;
this.returnView(res);
});
res.view({
'tareas' : tareasGlob,
'directoresproy' : directoresProy,
'usuarios' : usuariosGlob,
'proyectos' : proyectosGlob
});
},
returnView: function(res){
if (counter < 4)
return;
// return view logic here
}