Promise Disposer 패턴 이해
코드에서 Promise Disposer 패턴을 발견했지만 그 목적은 여전히 파악하기 어렵습니다. 이 글의 목적은 개념을 명확히 하고 그 적용을 시연하는 것입니다.
문제 개요
코드 조각에서:
<code class="javascript">function getDb() { return myDbDriver.getConnection(); } var users = getDb().then(function (conn) { return conn.query("SELECT name FROM users").finally(function (users) { conn.release(); }); });</code>
문제가 발생했습니다. 각 getDb 호출 후 데이터베이스 연결 해제를 무시하면 잠재적인 리소스 누수가 발생할 수 있습니다. 리소스 제한을 초과하면 시스템이 정지될 수 있습니다.
Disposer 패턴 소개
Promise Disposer 패턴은 코드 범위와 해당 리소스 간에 강력한 연결을 설정합니다. 소유하고 있습니다. 리소스를 범위에 바인딩하면 범위가 종료될 때 즉시 릴리스되어 감독 위험이 제거됩니다. 이 패턴은 C#의 using, Python의 with, Java의 try-with-resource 및 C의 RAII와 유사합니다.
패턴 구조
디스스포저 패턴은 특정 패턴을 따릅니다. 구조:
<code class="javascript">withResource(function (resource) { return fnThatDoesWorkWithResource(resource); // returns a promise }).then(function (result) { // resource disposed here });</code>
코드에 적용
코드를 Disposer 패턴으로 리팩토링하여:
<code class="javascript">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(); }); }</code>
이제 다시 작성할 수 있습니다. 이전 코드는 다음과 같습니다.
<code class="javascript">withDb(function (conn) { return conn.query("SELECT name FROM users"); }).then(function (users) { // connection released here });</code>
올바른 폐기를 보장하려면 finally 블록 내에서 리소스가 해제되었는지 확인하세요.
실제 사례
실제로 Disposer 패턴의 주목할만한 예로는 Sequelize 및 Knex(Bookshelf의 쿼리 빌더)가 있습니다. 이 애플리케이션은 여러 AJAX 요청 완료에 따라 로딩 표시기를 표시하고 숨기는 등 복잡한 비동기 프로세스 관리까지 확장됩니다.
위 내용은 Promise Disposer 패턴은 무엇이며 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!