Reputation: 7536
I've started using the Q Promise package in a simple node.js application. So I'm interested in how I can close the db connection after all promise sequence is complete.
Example:
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);
});
I want to close the connection after displaying the collection names but there's no db context in this anonymous function.
Is there the way how to handle such cases with the promise pattern?
Upvotes: 4
Views: 8033
Reputation: 140230
If you don't want to do nesting (I certainly don't...) then you can just do like so:
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();
});
Upvotes: 4
Reputation: 664538
You can nest then
-callbacks arbitrarily. It's getting closer to the pyramid of doom, yes, but it's the only way to keep arguments in scope. In your case:
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));
However, notice that you usually wouldn't connect and close too often.
Upvotes: 3