>웹 프론트엔드 >JS 튜토리얼 >Promise Disposer 패턴은 무엇이며 어떻게 작동합니까?

Promise Disposer 패턴은 무엇이며 어떻게 작동합니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-18 14:52:02390검색

What is the Promise Disposer Pattern and How Does it Work?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.