4

我正在学习来自 PHP 背景的 node.js,JavaScript 级别有限。我想我现在已经克服了异步方法所暗示的思维方式的改变。我喜欢它。

但是,和我之前的许多其他人一样,我很快就理解了“厄运金字塔”的具体含义。

所以我构建了这些小“虚拟”路由和视图来了解如何正确使用 Async.js。我只是花了最后 5 个小时编写以下代码(当然重写了数十次)。它可以工作,但我想知道如何才能走得更远,让这段代码更简单(不那么冗长,更容易阅读和维护)。

我在网上找到了很多资源,尤其是在这里,但总是在这里和那里找到一些信息。

我猜此时我应该使用“bind”和“this”和 async.apply 来缩短瀑布调用的最后两个函数。

问题是要定义对象“db”,以便我可以在其上使用“collection”方法(用于第二个函数)。

我确实在 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

1

如果您使用的是mongodb JS Driver,那么这应该可以:

async.waterfall(
            [ 
             function (cb) {
               new MongoClient(...)
               .connect('mongodb://localhost:27017/mybdd', cb);
             },

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

或者,如果您想使用async.apply,只需传递 MongoClient 的实例

async.apply(new MongoClient(...).connect, 'mongodb://localhost:27017/mybdd')
于 2013-10-29T20:55:57.113 回答
0

我最近创建了一个名为 WaitFor 的简单抽象,用于在同步模式下调用异步函数(基于 Fibers):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 回答