promisify 함수

전병민·2023년 6월 6일
0

코드분석

목록 보기
1/1
function promisify(f, manyArgs = false) {
  return function (...args) {
    return new Promise((resolve, reject) => {
      function callback(err, ...results) {
        if (err) {
          reject(err);
        } else {
          resolve(manyArgs ? results : results[0]);
        }
      }

      args.push(callback);

      f.call(this, ...args);
    });
  };
};

개요

promisify 는 콜백 형태의 비동기 함수를 호출하는 함수를 프로미스화 해주는 헬퍼 함수입니다.


설명

promisify 함수는 자바스크립트의 여러 고급 개념들이 사용되어 분석 해보려 합니다. 대부분의 설명은 코드 출처에 명확히 설명되어 있기 때문에 여기에서는 문서에서 직접적으로 언급하지 않은 내용을 설명합니다.

팩토리 함수

promisify 는 콜백 형태의 비동기 처리 함수라면 어떤 함수든 프로미스화한 함수를 만들어줍니다. 따라서 promisify 는 일종의 팩토리 함수입니다.

클로저

팩토리 함수를 만드는 과정에서 클로저라는 개념이 사용됩니다. promisifyf, manyArgs 를 인자로 갖습니다. promisify 실행이 끝나고 나면 f, manyArgs 는 가비지컬랙터에 의해 소멸되어야 하지만, promisify 가 실행될 때 생성된 익명함수는 자신의 [[Environment]]자신이 생성될 때의 렉시컬 환경에 대한 참조를 가지고 있습니다. 따라서 promisify 가 반환한 함수를 실행하면 promisify 의 실행이 끝났음에도 불구하고 promisify 실행 시점의 f, manyArgs 를 가지고 실행됩니다.

가변 인자 함수

promisify 는 가변 인자 함수를 반환합니다. 이는 promisify 가 반환한 함수가 인자를 유연하게 설정할 수 있도록 해줍니다.

Promise

promisify 의 목적에 맞게 promisify 가 반환한 함수가 콜백이 아니라 Promise 로 비동기 처리하도록 합니다.

Function.prototype.call

promisify 함수의 목적은 비동기 함수 f 를 프로미스로 래핑하는 것이기 때문에, f 함수가 기존에 사용되던 this 컨텍스트를 유지하면서 호출되어야 합니다. 그렇기 때문에 f.call(this, ...args) 를 사용하여 f 함수를 호출할 때 this 값을 전달합니다.


코드 출처

javascript.info - promisify

profile
JavaScript/React 개발자

0개의 댓글