Spec-Zone.ru › Bluebird

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API