node.js中的async.js瀑布:如何使用bind和这个?

我正在学习来自具有有限JavaScript级别的PHP背景的node.js。 我想我现在已经解决了asynchronous方法所隐含的思维方式的变化。 我喜欢它。

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

所以我build立这些小的“虚拟”路线和视图,以了解如何正确使用Async.js。 我只花了最后5个小时写下面的代码(当然重写了几十次)。 它的工作原理,但我想知道如何进一步,使这个代码更简单(不详细,更容易阅读和维护)。

我在网上发现了很多资源,特别是在这里,但总是通过一些信息在这里和那里。

我猜在这一点上,我应该使用“绑定”和“this”与async.apply使缩短瀑布调用的最后2个函数。

问题是获取对象“db”定义,所以我可以使用它的“收集”方法(第二个function)。

我真的search了一个谷歌的例子,但是你不能直截了当地find“asynchronous瀑布绑定”(以及我试过的许多关键字变体)的例子。 当然有答案,但似乎没有什么与这个特殊问题有关…矿石,很可能,我还没有理解他们。

有人可以帮我吗? 我会很感激。

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

我最近创build了一个名为WaitFor的简单抽象,以同步模式调用asynchronous函数(基于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} ); } };