根据node-pool,获取资源的过程如下:
const resourcePromise = myPool.acquire();
resourcePromise
.then(function(client) {
client.query("select * from foo", [], function() {
// return object back to pool
myPool.release(client);
});
})
.catch(function(err) {
// handle error
});
想象一下,我有一个处理数据时发生异常的情况(在获取资源之后和发布之前)
就像下面的例子一样:
const resourcePromise = myPool.acquire();
resourcePromise
.then(function(client) {
client.query("select * from foo", [], function() {
throw new Error('unknown error');
myPool.release(client);
});
})
.catch(function(err) {
// how can I release the resource here?
});
如何释放资源呢?
答案 0 :(得分:1)
有几种方法。全局获取客户端钩子:
let client;
resourcePromise
.then(c=> {
client = c;
return query.whatever();
})
.catch(() => {
resource.release(client);
});
或者Bluebird的finally
之类的东西可以提供帮助:
let client;
resourcePromise
.then(c=> {
client = c;
})
.catch(/* whatever else */)
.finally(() => {
resource.release(client);
})
你必须确保处理超时,但是如果承诺永远不会解决(成功或不成功),你永远不会进入任何处理程序。
另一种方法是处理承诺链中的错误:
resourcePromise.then(function (client) {
return query.whatever(client)
.catch(() => resource.release(client));
});