node.js中的async.js瀑布:如何使用bind和this



我正在学习node.js,它来自PHP背景,JavaScript级别有限。我想我现在已经克服了异步方法所隐含的心态变化。我喜欢它。

但是,和我之前的许多人一样,我很快就明白了"末日金字塔"的具体含义。

因此,我构建了这些小的"伪"路由和视图,以了解如何正确使用Async.js。我只花了最后5个小时编写以下代码(当然重写了几十次)。它是有效的,但我想知道如何才能更进一步,使代码更简单(不那么冗长,更容易阅读和维护)。

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

我猜在这一点上,我应该将"bind"one_answers"this"与async.apply一起使用,以缩短瀑布调用的最后两个函数

问题是定义对象"db",这样我就可以对它使用"collection"方法(对于第二个函数)

我确实在谷歌上搜索了一个例子,但令人惊讶的是,你没有得到寻找"异步瀑布绑定"(以及我尝试过的许多关键字变体)的简单例子。当然有答案,但似乎没有一个与这个特定问题相关。。。很有可能,我还没听懂。

有人能帮我吗?我会非常感激的。

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} ); }
            }
        );
    }
);

如果您使用的是mongodb JS驱动程序,那么这应该可以工作:

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')

我最近创建了一个名为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} );
    }
};

相关内容

  • 没有找到相关文章

最新更新