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
는 일종의 팩토리 함수입니다.
팩토리 함수를 만드는 과정에서 클로저라는 개념이 사용됩니다. promisify
는 f
, manyArgs
를 인자로 갖습니다. promisify
실행이 끝나고 나면 f
, manyArgs
는 가비지컬랙터에 의해 소멸되어야 하지만, promisify
가 실행될 때 생성된 익명함수는 자신의 [[Environment]]
에 자신이 생성될 때의 렉시컬 환경에 대한 참조를 가지고 있습니다. 따라서 promisify
가 반환한 함수를 실행하면 promisify
의 실행이 끝났음에도 불구하고 promisify
실행 시점의 f
, manyArgs
를 가지고 실행됩니다.
promisify
는 가변 인자 함수를 반환합니다. 이는 promisify
가 반환한 함수가 인자를 유연하게 설정할 수 있도록 해줍니다.
promisify
의 목적에 맞게 promisify
가 반환한 함수가 콜백이 아니라 Promise
로 비동기 처리하도록 합니다.
promisify
함수의 목적은 비동기 함수 f
를 프로미스로 래핑하는 것이기 때문에, f
함수가 기존에 사용되던 this
컨텍스트를 유지하면서 호출되어야 합니다. 그렇기 때문에 f.call(this, ...args)
를 사용하여 f
함수를 호출할 때 this
값을 전달합니다.