最后使用' all'承诺数组上的聚合函数

时间:2014-03-20 19:25:25

标签: javascript promise q bluebird

我有一些代码可以打开并读取SQL脚本文件并并行打开与数据库的连接,完成后它会在连接上执行文件的内容。但是,连接结果需要“关闭”。我需要能够处理数据库连接成功并且读取文件失败的情况(可能是错误的文件名),并且在任何一种情况下仍然关闭连接。

以下是我目前使用的代码,如果查询成功或失败,它有一个finally()处理程序来关闭客户端,但如果文件读取失败,客户端将不会被关闭。

function execFile(db, file) {
    console.log('Connecting to ' + db);
    return Promise.all([
        connect('postgres://' + credentials + host + '/' + db),
        fs.readFileAsync(file, 'utf8')
    ]).spread(function(client, initSql) {
        console.log('Connected to ' + db);
        console.log('Running init script ' + file);
        return client.queryAsync(initSql).finally(client.end);
    });
}

我使用bind()函数进行了一些操作,将客户端传递给finally块,但我对它引入的复杂性并不满意。我觉得settle()在这里很有用,我现在正在玩这个。

处理此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

function execFile(db, file) {
    console.log('Connecting to ' + db);
    var client = connect('postgres://' + credentials + host + '/' + db);
    var initSql = fs.readFileAsync(file, 'utf8');
    return Promise.all([client, initSql]).spread(function(client, initSql) {
        console.log('Connected to ' + db);
        console.log('Running init script ' + file);
        return client.queryAsync(initSql);
    }).finally(function() {
       if (client.isFulfilled()) client.inspect().value().end();
    });
}