4

JavaScriptレベルが制限されたPHPバックグラウンドからのnode.jsを学んでいます。非同期アプローチによって暗示された考え方の変化を乗り越えたと思います。そして、私はそれが大好きです。

しかし、私の前の多くの人たちと同じように、私は「破滅のピラミッド」の具体的な意味をすぐに理解しました。

そこで、Async.js を適切に使用する方法を理解するために、これらの小さな「ダミー」ルートとビューを作成します。私は次のコードを書くのに最後の 5 時間を費やしました (もちろん何十回も書き直しました)。それは機能しますが、どうすればこのコードをよりシンプルに (冗長でなく、読みやすく、維持しやすく) できるのだろうかと思います。

私はウェブ上、特にここで多くのリソースを見つけましたが、常にあちこちで少しの情報を見つけました.

この時点で、async.apply で "bind" と "this" を使用して、ウォーターフォールによって呼び出される最後の 2 つの関数を短縮する必要があると推測しています。

問題は、オブジェクト「db」を定義して、「コレクション」メソッドを使用できるようにすることです(2番目の関数用)。

私は実際に Google で例を検索しましたが、「非同期ウォーターフォール バインド」(および私が試した多くのキーワードのバリエーション) を検索する簡単な例が得られないのは驚くべきことです。もちろん答えはありますが、この特定の問題に関連するものはないようです...または、おそらく、私はそれらを理解していません。

誰かがこれについて私を助けることができますか? 私は非常に感謝します。

app.get('/dummy',

    function(req, res) {

        var MongoClient = require('mongodb').MongoClient;

        async.waterfall(
            [
                async.apply(MongoClient.connect, 'mongodb://localhost:27017/mybdd'),

                function(db, callback) {
                    db.collection('myCollection', callback);
                },

                function(collection, callback) {
                    collection.find().sort({"key":-1}).limit(10).toArray(callback);
                }

            ], function(err, results) {
                if (err) console.log('Error :', err);
                else { res.render('dummy.jade', { title:'dummy', results: results} ); }
            }
        );

    }

);
4

2 に答える 2

0

私は最近、非同期関数を同期モードで呼び出すための WaitFor という名前の単純な抽象化を作成しました (ファイバーに基づく): https://github.com/luciotato/waitfor

私はmongodbクライアントに精通していないので、あなたが何をしようとしているのかを推測することがほとんどです:

WaitFor を使用すると、コードは次のようになります。

var MongoClient = require('mongodb').MongoClient;
var wait = require('waitfor');

app.get('/dummy', function(req, res) { 

       // handle request in a Fiber, keep node spinning
       wait.launchFiber(handleDummy,req,res) 

       }
);


function handleDummy(req, res) {
    try {
        var db = wait.for(MongoClient.connect, 'mongodb://localhost:27017/mybdd');
        var collection = wait.forMethod(db,'collection','myCollection');
        var results = wait.forMethod(collection.,'sort',{"key":-1}).toArray();
        res.render('dummy.jade', { title:'dummy', results: results} );
    }
    catch(err) {
        res.render('error.jade', { title:'error', message: err.message} );
    }
};
于 2013-08-12T22:30:26.880 に答える