0

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

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()”时尚未为变量赋值并且运空。

提前感谢您可以帮助我纠正问题。

4

2 回答 2

2

有一些节点包可以帮助您解决像这样的异步编码问题。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对数组进行异步循环,以及各种有趣的东西。

此处为 async 的完整文档。

于 2014-06-16T23:58:37.720 回答
0

在调用 res.view 之前,您必须确保所有 4 个 find 方法都已完成。我会说有一个计数器来跟踪您收到了多少响应,每次响应返回时递增 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

}
于 2014-06-16T23:22:15.880 回答