[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 함수가 두 가지 일을 한다. 동적 타입 언어의 특징을 최대한 활용한 것이다...