자바스크립트에서 모든 비동기 함수와 라이브러리가 프라미스를 바로 사용할 수 있도록 지원하는 것은 아니다. 대부분의 경우 일반적인 콜백 기반의 함수를 프라미스를 반환하는 함수로 바꾸어야 한다. 이것을 프라미스화 라고 한다. 다행히도, Node.js에서 사용된 콜백 규칙을 사용하면, Node.js 스타일 API를 프라미스화하기 위해 재사용 가능한 함수로 만들수가 있다. 프라미스 객체의 생성자를 사용하면 이 작업을 용이 하게 할 수 있다.

module.exports.promisify = function(callbackBasedApi) {
	return function promisified(...arg) {
		return new Promise( (resolve, reject) => { 
			args.push( (err, result) => {
				if (err) {
					return reject(err);	
				}
				if(..args.length <= 2){
					return resolve(result);
				}
				resolve(..args)
      })
		 callabckBasedApi.apply(null, args)
		})
	}
}

위 함수는 promisfied() 라는 또 다른 함수를 반환하는데, 이를 입력에 주어진 callbackBasedApi의 프라미스 버전을 나타낸다. 아래는 이것의 대한 동작이다.

🔔대부분의 프라미스 구현체들은 이미 Node.js 스타일의 API를 프라미스로 변환하는 일조ㅓㅇ의 도우미 함수들을 제공하고 있다. Q에는 Q.denodeify()와 Q.nbind()가 있고 Bluebird에는 Promise.promisity가 있다.

순차반복 - 패턴


프라미스들을 순차적으로 반복하는 패턴이 아래의 코드이다.

let tasks = []
let promise = tasks.reduce( (prev, task) => {
	return prev.then( () => {
		return task();
		});
}, Promise.resolve());
promise.then( () => {
	// 모든 작업이 완료됨
})

이 패턴을 적용하면 간단히 모든 작업 결과를 배열로 수집할 수 있다. 맵핑 알고리즘을 구현하거나 필터를 만드는 등의 작업을 할 수 있다.

병렬실행


프라미스를 사용하여 간단해지는 또 한가지의 실행 프름에는 병렬 실행 흐름이 있다. 사실 우리가 해야 할 일은 내장된 Promise.all()을 사용하는 것이 전부이다. 이 함수는 입력에서 받은 모든 프라미스들이 이행될 때만 이행되는 또 다른 프라미스를 만드는데, 이것은 다양한 프라미스들이 resolve되는 사이에 다른 명령이 실행되지 않게 한다. 때문에 본질적으로 병렬실행이다.

const spiderLinks = (currenUrl, body, nesting) => {
		if (nesting === 0) {
			return Promise.resolve();
	}
		const links = utilities.getPageLinks(currenUrl, body);
		const promises = links.map(link => spider(link, nesting - 1));
		
		return Promise.all(promises)
}