Spec-Zone.ru › Bluebird

Управление ресурсами

Правильное управление ресурсами без утечек может быть сложной задачей. Простое использование .finally недостаточно, как показывает следующий пример:

function doStuff() {
    return Promise.all([
        connectionPool.getConnectionAsync(),
        fs.readFileAsync("file.sql", "utf8")
    ]).spread(function(connection, fileContents) {
        return connection.query(fileContents).finally(function() {
            connection.close();
        });
    }).then(function() {
        console.log("query successful and connection closed");
    });
}

Это очень тонко, но со временем этот код исчерпает весь пул подключений, и серверу потребуется перезагрузка. Это происходит потому, что чтение файла может завершиться ошибкой, и тогда, конечно, .spread вообще не будет вызвано, а значит, подключение не будет закрыто.

Можно решить эту проблему, либо сначала прочитав файл, либо сначала подключившись, и только затем выполнив дальнейшие действия, если первый шаг удался. Однако это лишит много преимуществ использования асинхронности, и мы могли бы почти так же хорошо вернуться к использованию простого синхронного кода.

Мы можем сделать лучше, сохраняя конкурентность и не допуская утечек ресурсов, используя:

  • объекты-распорядители, объекты, которые оборачивают ресурс и метод для освобождения этого ресурса, вместе с
  • Promise.using, функцию для безопасного использования распорядителей таким образом, чтобы автоматически вызывался метод освобождения
var using = Promise.using;

using(getConnection(),
      fs.readFileAsync("file.sql", "utf8"), function(connection, fileContents) {
    return connection.query(fileContents);
}).then(function() {
    console.log("query successful and connection closed");
});

Продолжите чтение о объектах-распорядителях и Promise.using

© 2013–2018 Petka Antonov
Licensed under the MIT License.
http://bluebirdjs.com/docs/api/resource-management.html

Spec-Zone.ru

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