4

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

例子:

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);
});

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

有没有办法用承诺模式处理这种情况?

4

2 回答 2

4

如果您不想进行嵌套(我当然不想...),那么您可以这样做:

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();
});
于 2013-10-07T05:57:15.793 回答
3

您可以任意嵌套then-callbacks。它越来越接近末日金字塔,是的,但这是保持争论范围内的唯一方法。在你的情况下:

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

但是,请注意您通常不会过于频繁地连接和关闭

于 2013-10-03T00:47:52.697 回答