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、配列の非同期ループを実行したり、あらゆる種類の楽しいものを実行したりすることもできます。

非同期の完全なドキュメントはこちら

于 2014-06-16T23:58:37.720 に答える