Понимание шаблона удаления промисов
Вы столкнулись с шаблоном удаления промисов в своем коде, но его цель остается неясной. Цель этой статьи — прояснить концепцию и продемонстрировать ее применение.
Обзор проблемы
В фрагменте кода:
function getDb() {
return myDbDriver.getConnection();
}
var users = getDb().then(function (conn) {
return conn.query("SELECT name FROM users").finally(function (users) {
conn.release();
});
});
Вы столкнетесь с проблемой потенциальных утечек ресурсов, если пренебрегаете освобождением соединения с базой данных после каждого вызова getDb. Это может привести к зависанию системы в случае превышения ограничений ресурсов.
Представляем шаблон Disposer
Шаблон Promise Disposer устанавливает прочную связь между областью кода и ресурсом, в котором он находится. владеет. Привязывая ресурс к области, вы гарантируете его быстрое освобождение после завершения области, устраняя риск недосмотра. Этот шаблон имеет сходство с использованием C#, Python with, Java try-with-resource и C RAII.
Структура шаблона
Шаблон удаления соответствует определенному структура:
withResource(function (resource) {
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function (result) {
// resource disposed here
});
Применение его к вашему коду
Путем рефакторинга вашего кода в шаблон утилизатора:
function withDb(work) {
var _db;
return myDbDriver.getConnection().then(function (db) {
_db = db; // keep reference
return work(db); // perform work on db
}).finally(function () {
if (_db) _db.release();
});
}
Теперь вы можете переписать предыдущий код как:
withDb(function (conn) {
return conn.query("SELECT name FROM users");
}).then(function (users) {
// connection released here
});
Убедитесь, что ресурс освобождается в блоке Final, чтобы гарантировать правильную утилизацию.
Примеры из реальной жизни
Известные примеры На практике шаблон удаления включает Sequelize и Knex (построитель запросов Bookshelf). Его приложения позволяют управлять сложными асинхронными процессами, например отображать и скрывать индикаторы загрузки на основе выполнения нескольких запросов AJAX.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3