Node.js:在MongoDb中使用Promise

我已经开始在简单的node.js应用程序中使用Q Promise包。 所以我感兴趣的是如何在所有承诺序列完成后closures数据库连接。

例:

var toDbConnectionString = function(dbSettings) { return "mongodb://" + dbSettings.user + ":" + dbSettings.password + "@" + dbSettings.url; }; var connectionString = toDbConnectionString(dbSettings); Q.nfcall( MongoClient.connect, toDbConnectionString(dbSettings)) .then(function(db) { return Q.ninvoke(db, "collectionNames"); }) .then(function(collections) { console.log(collections); }) .catch(function() { console.log(arguments); }); 

我想在显示集合名称后closures连接,但在这个匿名函数中没有数据库上下文。

有没有办法如何处理这种承诺模式的情况?

你可以任意嵌套thencallback。 是的,它已经越来越接近厄运的金字塔了,但它是保持论点范围的唯一方法。 在你的情况下:

 Q.nfcall( MongoClient.connect, toDbConnectionString(dbSettings)) .then(function(db) { return Q.ninvoke(db, "collectionNames") .then(function(collections) { console.log(collections); }).finally(function() { db.close(); }); }) .catch(console.log.bind(console)); 

但是,请注意,您通常不会连接和closures太频繁 。

如果你不想嵌套(我当然不…),那么你可以这样做:

 var toDbConnectionString = function(dbSettings) { return "mongodb://" + dbSettings.user + ":" + dbSettings.password + "@" + dbSettings.url; }; var connectionString = toDbConnectionString(dbSettings); var db; Q.nfcall( MongoClient.connect, toDbConnectionString(dbSettings)) .then(function(_db) { db = _db; return Q.ninvoke(db, "collectionNames"); }) .then(function(collections) { console.log(collections); }) .catch(function() { console.log(arguments); }) .finally(function() { if (db) db.close(); });