프라미스화

콜백을 받는 함수를 프라미스를 반환하는 함수로 바꾸는 것을 '프라미스화(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 => ...)

 

 

참고자료

https://ko.javascript.info/promisify

+ Recent posts