Javascript 最后,在使用';全部';承诺数组上的聚合函数

Javascript 最后,在使用';全部';承诺数组上的聚合函数,javascript,promise,q,bluebird,Javascript,Promise,Q,Bluebird,我有一些代码可以打开和读取SQL脚本文件,并并行打开到数据库的连接,当它们完成时,它会在连接上执行文件的内容。但是,连接结果需要“关闭”。我需要能够处理数据库连接成功而读取文件失败(可能是错误的文件名)的情况,并且在这两种情况下仍然关闭连接 这是我当前使用的代码,它有一个finally()处理程序,用于在查询成功或失败时关闭客户端,但如果文件读取失败,则不会关闭客户端 function execFile(db, file) { console.log('Connecting to ' +

我有一些代码可以打开和读取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块,但我对它引入的复杂性不太满意。我有一种感觉,
solite()
在这里可能很有用,我现在正在玩这个


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

Woah。酷。我真的想让它起作用。它有用吗?我这样问是因为我对这一点还不太了解,它似乎可能会在承诺兑现之前尝试关闭连接。
all
是否只有在所有承诺兑现和/或拒绝之后才能完成?我喜欢这样;我要做的唯一更改是检查客户机承诺的解决方案,如果它被拒绝,则无需调用
end()
。另外,我认为外部范围中的
client
initSql
应该分别是
clientPromise
sqlPromise
,然后
clientPromise.value.end()
中的
finally
@Metagrapher在连接建立后成功调用finally,文件已读取,查询已完成。@Joshry Perry同意(但不带详细的匈牙利符号后缀:P),请检查edit@Esailija哈哈,很公平。您能详细说明一下在这种情况下,
inspect()
的作用吗?
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();
    });
}