[ECMAScript6] 성공적인 Promise는 중첩되지 않는다.
ES6 Promise 에는 독특한 특징이 있는데, 지난번 글 에서는 설명할 타이밍을 잡지 못해서 그냥 넘어갔었다. 이번에 그 특징에 관해 설명하도록 하겠다. 전에 모나드에 관해서 설명 하면서 모나드의 가장 기본적인 operator 중 하나인 bind operator 는 M[T] 타입의 모나드가 T 타입의 인자를 받아서 M[U] 타입의 값을 리턴하는 함수를 인자로 받아서 M[U] 타입의 모나드로 타입을 진행시킨다 1) 고 하였다. 하지만 ES6 Promise 의 then 함수 에 관해서 설명하면서 then 함수가 받는 콜백이 값을 리턴하면 resolved 된 Promise 가 리턴되고, 값을 throw 하면 rejected 된 Promise 가 리턴된다고 하였다. 즉, then 함수만으로는 모나드를 리턴하는 함수를 통해서 타입을 전진시키는 bind operator를 구현할 수 없으므로 완전한 모나드를 구현하지 못한다. 그렇다면 ES6의 Promise 는 어떻게 Promise 를 전진시킬까? 간단하다. 그냥 then 함수가 인자로 받는 콜백은 Promise 를 리턴해도 된다. 사실 Promise 가 모나드라는 것을 생각하면, 이쪽이 올바른 사용 법이다. 하지만 ES6뿐 아니라 다른 모나드 구현체에서도 bind operator뿐 아니라, 모나드가 아닌 값을 리턴하는 함수. 즉, (M[T], T => U) => M[U] 에 해당하는 함수도 구현한다. 이는 사실 내부적으로 unit operator 와 bind operator를 호출하기 때문에 굳이 필요한 함수는 아니다. 그러함에도 이 함수가 존재하는 이유는 실제로 이 구현을 사용하는 경우가 일반적인 bind operator를 사용하는 경우보다 많아서 사용자의 편의를 위해서 제공되는 것일 뿐이다. 그래도 보통은 둘을 같은 이름의 함수로 구현하지는 않고, 다른 이름의 함수로 구현한다. 그렇지만 ES6에서는 then 함수가 두 가지 일을 한다. 동적 타입 언어의 특징을 최