Promise.using
Promise.using(
Promise|Disposer|any resource,
Promise|Disposer|any resource...,
function(any resources...) handler
) -> Promise
Promise.using(
Array<Promise|Disposer|Any> resources,
function(Array<any> resources) handler
) -> Promise
В сочетании с .disposer, using гарантирует, что независимо от обстоятельств, указанный освободитель ресурсов будет вызван, когда обещание, возвращаемое обратным вызовом, переданным в using, будет выполнено. Освободитель ресурсов необходим, так как в стандартном интерфейсе Node нет механизма для освобождения ресурсов.
Вот простой пример (где getConnection() определён, чтобы возвращать соответствующий объект Disposer):
using(getConnection(), function(connection) {
// Don't leak the `connection` variable anywhere from here
// it is only guaranteed to be open while the promise returned from
// this callback is still pending
return connection.queryAsync("SELECT * FROM TABLE");
// Code that is chained from the promise created in the line above
// still has access to `connection`
}).then(function(rows) {
// The connection has been closed by now
console.log(rows);
});
Использование нескольких ресурсов:
using(getConnection(), function(conn1) {
return using(getConnection(), function(conn2) {
// use conn1 and conn 2 here
});
}).then(function() {
// Both connections closed by now
})
Вышеприведённое также можно записать следующим образом (с оговоркой, см. ниже):
using(getConnection(), getConnection(), function(conn1, conn2) {
// use conn1 and conn2
}).then(function() {
// Both connections closed by now
})
Однако, если второй getConnection сгенерирует ошибку синхронно, первое соединение будет утечка ресурсов. Это не произойдёт при использовании API через методы promisified bluebird. Можно обернуть функции, которые могут вызывать исключения, в Promise.method, что превратит синхронные ошибки в отклоняемые обещания.
Обратите внимание, что вы можете смешивать обещания и освободители, что позволит вам получить все необходимые ресурсы параллельно, а не последовательно.
// The files don't need resource management but you should
// still start the process of reading them even before you have the connection
// instead of waiting for the connection
// The connection is always closed, no matter what fails at what point
using(readFile("1.txt"), readFile("2.txt"), getConnection(), function(txt1, txt2, conn) {
// use conn and have access to txt1 and txt2
});
Вы также можете передать ресурсы в массиве в первом аргументе. В этом случае обработчик функции будет вызываться только с одним аргументом, который является массивом, содержащим разрешенные ресурсы в соответствующих позициях в массиве. Пример:
var connectionPromises = [getConnection(), getConnection()];
using(connectionPromises, function(connections) {
var conn1 = connections[0];
var conn2 = connections[1];
// use conn1 and conn2
}).then(function() {
// Both connections closed by now
})
© 2013–2018 Petka Antonov
Licensed under the MIT License.
http://bluebirdjs.com/docs/api/promise.using.html