자바스크립트 생태계에서 전통적인 콜백 패턴에 대항 흥미로운 대안들을 제시하고 있는데, 가장 유명한 대안 중 하나는 프라미스이다. 프라미스는 ES5의 일부이며, node4에서부터 node.js에서 기본 적으로 사용할 수 있게 되었다.
매우 간단한 용어로, 프라미스는 함수가 Promise라는 객체를 반환할 수 있도록 하는 추상 클래스이다. Promise는 비동기 작업의 최종 결과를 나타내는데, 용어로 대기중(pending)이란 아직 비동기 작업이 완료되지 않았다는 것이고, 성공적으로 끝났을 때를 이행됨(fuifilled), 작업이 실패하여 종료되는 것을 거부되었다(rejected)라고 하는데 프라미스가 이행되거나 거부되면 처리된(settled) 것으로 간주된다. 이행 값이나 거부와 관련된 오류를 받으려면 promise의 then() 메소드를 사용해야 한다. then() 메소드의 중효한 특성 중 하나는 도익식으로 다른 프라미스를 반환한다는 것이다. onFuifilled 나 onRejected 함수 중 하나가 값을 반환할 경우, then()메소드가 반환하는 프라미스는 다음과 같다.
이 기능을 사용하면 여러 가지 환경에서 비동기 작업을 손쉽게 통합하고 배치 할 수 있는 프라미스 체인을 구성할 수 있다. 또한 onFuifilled 나 onRejected 핸들러를 지정하지 않으면 이행 값 또는 거부 이유가 자동으로 체인 내 프라미스들로 전달된다. 프라미스 체인을 이용하면 작업들을 순차 실행 시키는 일은 그리 어렵지 않다.
asyncOperation(arg)
.then( result1 => {
return asyncOperation(arg2)
})
.then( result2 => {
return 'done'
})
.then(undefiend, err => {
// 여기서 모든 에러를 처리
})
아래 그림은 프라미스 체인이 동작하는 방식을 설명한 것이다.

프라미스의 또 다른 중요한 특성은 앞의 예에서 체인의 마지막 then() 함수에 'done'이라는 문자열을 반환한 것처럼 값을 가지고 동기적으로 프라미스를 해결한다고 할지라도 onFuifilled 나 onRejected 함수에 대한 비동기적인 호출을 보장한다는 것이다. 이것은 실수로 잘고를 풀어 놓을 수도 있는 모든 상황에 대비하여 우리의 코드를 보호함으로써 큰 노력을 들이지 않고 비동기 코드를 일관성 있고 견고하게 만든다. 이게 재밌는 부분인데, onFuifilled 나 onRejected 핸들러에서 thorw문을 사용한 예외가 발생한 경우, then() 메소드를 통해 반횐된 프라미스는 발생한 예외를 이유로하여 자동으로 거부된다. 이것은 예외가 프라미스들을 통해 자동으로 체인 전체에 전파되며 throw문을 사용할 수 있다는 이야기 이기 때문에 CPS와 비교해보면 엄청난 이점이다.
역사적으로 프라미스 라이브러리에 대한 여러 가지 구현체가 있었지만, 대부분 서로 호환되지 못하였다. 해서 구현체를 사용한 라이브러리로부터 가져온 프라미스 객체들 간에 프라미스 체인을 만들 수 없었다. 하여 자바스크립트 커뮤니티에서는 이러한 한계를 극복하고자 열심히 노력했고, 이러한 노력의 결실로 Promises/A+ 문서가 만들어 졌다. 이 스펙은 then 메소드의 동작을 자세히 설명하여 상호 운용 가능한 기반을 제공한다. 이 기반으로 만들어진 서로 다른 라이브러리의 프라미스 객체는 함께 사용 할 수 있도록 하고 있다. 자바스크립트 및 Node.js에서 Promises/A+ 사양을 구현한 여러 라이브러리가 있다. 가장 있는 것들에는 다음과 같은 것 있다.