因为我可以在同一个控制器动作中使用不同的模型



我正试图向视图发送来自多个模型的信息,如下所示:

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
}

相关内容

  • 没有找到相关文章

最新更新