【问题标题】:async.js waterfall in node.js: how to use bind and this?node.js 中的 async.js 瀑布:如何使用 bind 和 this?
【发布时间】:2013-10-30 04:55:57
【问题描述】:

我正在学习 node.js,来自 PHP 背景,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} ); }
            }
        );

    }

);

【问题讨论】:

  • 你能发布你想要的代码样子吗?
  • 理想情况下,第二个和第三个函数只有 1 行,例如无需通过匿名函数。 似乎根据我在 StackOverflow 和网络上的阅读,使用“bind”和“this”......但我还没有成功。
  • 我不认为这是可能的,因为bind 假设您有一个要绑定的函数/方法,并且在这种情况下包含方法的对象(dbcollection)是瀑布中上一步的动态结果。
  • 好的,我花了一些时间来理解你的答案,但我认为你是对的。这无论如何都有效,但如果有人有一个想法,使用任何需要更简洁,我很想知道,为了始终保持学习! ;-) 谢谢 robertklep 和 @mak 关注我的问题。
  • 请记住,bind 的第一个参数是调用的上下文:stackoverflow.com/questions/22714355/…

标签: node.js callback asynccallback waterfall async.js


【解决方案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')

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-09
      • 2018-02-13
      • 2016-03-04
      • 1970-01-01
      • 2014-10-31
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多