프라미스화
콜백을 받는 함수를 프라미스를 반환하는 함수로 바꾸는 것을 '프라미스화(promisification)'라고 합니다.
이는 자바스크립트에서 비동기 작업을 더 깔끔하게 처리할 수 있게 해줍니다.
따라서 콜백보다는 프라미스가 더 편리하기 때문에 콜백 기반 함수와 라이브러리를 프라미스를 반환하는 함수로 바꾸는 게 좋은 경우가 생깁니다.
예시 코드
콜백
function loadData(callback) {
setTimeout(() => {
callback('데이터 로드 완료');
}, 1000);
}
loadData(data => {
console.log(data); // 데이터 로드 완료
});
프라미스화
function loadData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('데이터 로드 완료');
}, 1000);
});
}
loadData().then(data => {
console.log(data); // 데이터 로드 완료
});
f가 두 개를 초과하는 인수를 가진 콜백, callback(err, res1, res2, ...)을 받는경우 처리하는 방법
새롭게 만든 함수를 promisify(f, true)형태로 호출
// 콜백의 성공 결과를 담은 배열을 얻게 해주는 promisify(f, true)
function promisify(f, manyArgs = false) {
return function (...args) {
return new Promise((resolve, reject) => {
function callback(err, ...results) { // f에 사용할 커스텀 콜백
if (err) {
reject(err);
} else {
// manyArgs가 구체적으로 명시되었다면, 콜백의 성공 케이스와 함께 이행 상태가 됩니다.
resolve(manyArgs ? results : results[0]);
}
}
args.push(callback);
f.call(this, ...args);
});
};
};
// 사용법:
f = promisify(f, true);
f(...).then(arrayOfResults => ..., err => ...)
참고자료
'프로그래밍 > JavaScript' 카테고리의 다른 글
[ JS ] 프라미스와 async / await : async와 await (0) | 2024.06.05 |
---|---|
[ JS ] 프라미스와 async / await : 프라미스 API (0) | 2024.06.05 |
[ JS ] 프라미스와 async / await : 프라미스와 에러 핸들링 (0) | 2024.06.05 |
[ JS ] 프라미스와 async / await : 프라미스 체이닝 (0) | 2024.06.04 |
[ JS ] 프라미스와 async / await : promise (0) | 2024.06.04 |