"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Promise Disposer 패턴은 무엇이며 어떻게 작동합니까?

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

2024-11-09에 게시됨
검색:897

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

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 요청 완료에 따라 로딩 표시기를 표시하고 숨기는 등 복잡한 비동기 프로세스 관리까지 확장됩니다.

릴리스 선언문 이 글은 1729234278에서 재인쇄되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3