Promise Disposer 패턴 이해
코드에서 Promise Disposer 패턴을 발견했지만 그 목적은 여전히 파악하기 어렵습니다. 이 문서의 목적은 개념을 명확히 하고 해당 응용 프로그램을 시연하는 것입니다.
문제 개요
코드 조각에서:
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#의 using, Python의 with, Java의 try-with-resource 및 C의 RAII와 유사합니다.
패턴 구조
디스포저 패턴은 특정 패턴을 따릅니다. 구조:
withResource(function (resource) {
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function (result) {
// resource disposed here
});
코드에 적용
코드를 Disposer 패턴으로 리팩토링하여:
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
});
올바른 폐기를 보장하려면 finally 블록 내에서 리소스가 해제되었는지 확인하세요.
실제 사례
실제로 disposer 패턴에는 Sequelize 및 Knex(Bookshelf의 쿼리 빌더)가 포함됩니다. 해당 애플리케이션은 여러 AJAX 요청 완료에 따라 로딩 표시기를 표시하고 숨기는 등 복잡한 비동기 프로세스 관리까지 확장됩니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3