node.js - node.js 中的 async.js waterfall : how to use bind and this?

标签 node.js callback asynccallback waterfall async.js

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

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

所以我构建了这些小的“虚拟”路由并查看以了解如何正确使用 Async.js。我只是花了最后 5 个小时来编写以下代码(当然重写了数十次)。它有效,但我想知道如何才能更进一步并使这段代码更简单(不那么冗长,更易于阅读和维护)。

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

此时我猜测我应该将“bind”和“this”与 async.apply 结合使用来缩短 waterfall 调用的最后两个函数。

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

我确实在 Google 中搜索了一个示例,但令人惊讶的是您没有找到简单的示例来寻找“异步 waterfall 绑定(bind)”(以及我尝试过的许多关键字变体)。当然有答案,但似乎没有一个与这个特定问题相关……或者,很可能,我还没有理解它们。

有人可以帮我解决这个问题吗?我将不胜感激。

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

关于node.js - node.js 中的 async.js waterfall : how to use bind and this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17624938/

相关文章:

node.js - Sequelize.js - "where"子句中连接表中的列

javascript - Suitescript 2.0 ResultSet.Each 回调函数超过 4000

java - C++ 二进制到 Java 得到 "java.lang.Error: Invalid memory access"

c# - 异步回调和套接字

javascript - 通过回调强制异步打印顺序

javascript - NodeJS Async - 将参数传递给回调

node.js - 使用 Azure AD 登录我的 Node.js 应用程序后出现隐秘的 "client does not exist"错误

node.js - 使用 nant 通过 exec 编译 LESS

javascript - "cherry picking"node.js 通过重要的只有一个功能而不是整个包在后端导入有什么好处吗?

jquery - 为什么我的 jquery 回调提前触发?