2016년 8월 14일 일요일

ReactiveX(Rx), Promise, 그리고 Future

Rx를 하다보니 fiber/future도 새롭게 보인다.
가령 비동기 구간을 setTimeout -> ..... , 1000 으로 하는 구현을 해보자.
Rx.Observable.create (observable)->
  # callback block
  setTimeout ->
    observable.onNext "<결과값>"
  , 1000
.subscribe (res)->
  console.log res
요건 Promise로 풀면
new Promise (resolve, reject)->
  # callback block
  setTimeout ->
    resolve "<결과값>"
  , 1000
.then (res)->
  console.log res
거의 같은 모양을 하고 있다.
그 fiber/future로 풀면
doSomeAsync = ->
  future = new Future()
  setTimeout ->
    future.return "<결과값>"
  ,1000
  future.wait()
console.log doAsync()
핵심은 동기에서 return 에 들어갈 부분이 대체되고 그걸 외부에서 받는 부분이랑 한 쌍을 구성한다는 점인데 future는 c coroutine library 인 libcoro(https://github.com/ramonza/libcoro)를 사용하고 있다. 
사실 coroutine만 해도 c에서 구현만 http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html 이렇게 다양한데.
ECMA6 (coffeescript 1.10.0) 에서 반쪽짜리 코루틴이라고 말하는 generator도 같이 비교해도 봐야하지 않을까 싶어서 보니
req=(url)->
  setTimeout ->
    it.next(url.length)
  , 1000
main=-> console.log yield req "hohoho bababa"
it=main()
it.next()
req가 impure 한 function이 되는게 맘에 걸린다. 어째서 생성시점 이전에 외부의 it를 받아서 .next를 하는 걸까.
이전 글(http://spectrumdig.blogspot.kr/2016/07/generator.html)처럼 Promise를 쓸 수 있지만 그럴거면 그냥 다 Promise로 하는게 낫지 않나 하는 생각도 들고.

 이곳의 소스는 모두 여기(http://decaffeinate-project.org/repl/) 에서 돌려볼 수 있다.