Управление ресурсами
Правильное управление ресурсами без утечек может быть сложной задачей. Простое использование .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