3

異なる情報を含む 2 つのパネルを表示するダッシュボード ビュー ( dashboard.jade ) があります。すべての情報はデータベースから取得してビューに送信する必要があります。

2 つのアクションが定義されたルート ファイル ( document.js ) があるとします。

exports.getAllDocuments = function(req, res){
    doc = db.model('documents', docSchema);

    doc.find({}, function(err, documents) {
        if (!err) { 
            // handle success
        }
        else { 
            throw err;
        }
    });
};

exports.getLatestDocumentTags = function(req, res){
    tags = db.model('tags', tagSchema);

    tags.find({}, function(err, docs) {
        if (!err) { 
            // handle success
        }
        else { 
            throw err;
        }
    });
};

これらの関数は、データベースからデータを取得するためだけに使用されます。

ここで、ダッシュボード ビューをレンダリングする exports.index 関数の下にある、dashboard.js ルート ファイルからダッシュボード ビューにそのデータを送信したいと思います。

問題は、db 呼び出しが非同期になるため、ビューを呼び出す前にデータにアクセスできないことです。

すべてのデータベース呼び出しを単純に実行し、コールバックを介してすべてのデータを一度にビューに配信するアクションを持つことができると思いますが、それではデータ取得アクションが再利用できなくなります。

この問題に正しく取り組む方法について本当に混乱しています。おそらく、この非同期のことをすべて間違っているのでしょう。誰かがこれを適切に行う方法についてのヒントを教えてもらえますか?

4

2 に答える 2

5

ここにあなたの興味をそそるものがあります。

//Check out the async.js library
var async = require('async');

//Set up your models once at program startup, not on each request
//Ideall these would be in separate modules as wel
var Doc = db.model('documents', docSchema);
var Tags = db.model('tags', tagSchema);

function index(req, res, next) {
    async.parallel({ //Run every function in this object in parallel
    allDocs: async.apply(Doc.find, {}) //gets all documents. async.apply will
    //do the equivalent of Doc.find({}, callback) here
    latestDocs: async.apply(Tags.find, {})
    ], function (error, results) { //This function gets called when all parallel jobs are done
      //results will be like {
      //  allDocs: [doc1, doc2]
      //  latestDocs: [doc3, doc4]
      // }
      res.render('index', results);
    });
}
exports.index = index;
};

いくつかのチュートリアルを試してください。ノードで非同期プログラミングがどのように機能するかについて「ちょっと」という瞬間がなかった場合は、ガイドなしで新しいプログラムを作成する前に、ガイド付きのハンドヘルド チュートリアルを続けてください。

于 2012-12-09T00:38:23.243 に答える