4

Node.jsでコールバックスタイルのプログラミングを使用する方法を学ぶのにイライラする問題があります。MongoDBデータベースへのクエリがあります。結果を実行する関数を渡すと機能しますが、フラット化して値を返すようにします。これを正しく行う方法についてのヘルプや指示をいただければ幸いです。これが私のコードです:

var getLots = function(response){
    db.open(function(err, db){
        db.collection('lots', function(err, collection){
            collection.find(function(err, cursor){
                cursor.toArray(function(err, items){
                    response(items);
                })
            })
        })
    })
}

私はもっ​​とこのようなものが欲しいです:

lots = function(){
    console.log("Getting lots")
    return db.open(openCollection(err, db));
}

openCollection = function(err, db){
    console.log("Connected to lots");
    return (db.collection('lots',findLots(err, collection))
    );
}

findLots = function(err, collection){
    console.log("querying 2");
    return collection.find(getLots(err, cursor));
}

getLots = function(err, cursor) {
    console.log("Getting lots");
    return cursor.toArray();
}

データの最終セットが関数呼び出しを介してバブルバックする場所。

問題は、Node.jsから、エラーが定義されていない、またはコレクションが定義されていないというエラーが表示されることです。何らかの理由でコールバックをネストすると、正しいオブジェクトが渡されます。このフラットなスタイルにしようとすると、物事が定義されていないと文句を言います。必要なオブジェクトを渡す方法がわかりません。

4

2 に答える 2

4

必要なのは、npmを介してノードで利用でき、Node.jswikiにカタログ化されている多くの制御フローライブラリの1つです。私の具体的な推奨事項はcaolan/asyncです。この関数を使用してasync.waterfall、各非同期操作を順番に実行する必要があり、それぞれが前の操作の結果を必要とするこのタイプのフローを実行します。

擬似コードの例:

function getLots(db, callback) {
   db.collection("lots", callback);
}

function findLots(collection, callback) {
    collection.find(callback);
}

function toArray(cursor, callback) {
    cursor.toArray(callback);
}

async.waterfall([db.open, getLots, find, toArray], function (err, items) {
    //items is the array of results
    //Do whatever you need here
    response(items);
});
于 2012-04-20T14:46:49.503 に答える
0

asyncは優れたフロー制御ライブラリです。Frame.jsには、デバッグの改善や同期関数実行の配置の改善など、いくつかの特定の利点があります。(現在、非同期のようにnpmにはありませんが)

フレームでの表示は次のとおりです。

Frame(function(next){
    db.open(next);
});
Frame(function(next, err, db){
    db.collection('lots', next);
});
Frame(function(next, err, collection){
    collection.find(next);
});
Frame(function(next, err, cursor){
    cursor.toArray(next);
});
Frame(function(next, err, items){
    response(items);
    next();
});
Frame.init();
于 2012-04-20T15:31:52.690 に答える