我试图向视图发送来自多个模型的信息,如下所示:
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()"还没有为变量赋值,并且是空的。
在此先感谢您的帮助,您可以帮我解决问题。
答案 0 :(得分:2)
有一些节点包可以帮助您解决像这样的异步编码问题。 Sails全局化async库,这将允许您将代码重写为:
// 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
对数组进行异步循环,以及各种有趣的东西。
async here的完整文档。
答案 1 :(得分:0)
在调用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
}