Rx를 하다보니 fiber/future도 새롭게 보인다.
가령 비동기 구간을 setTimeout -> ..... , 1000 으로 하는 구현을 해보자.
그 fiber/future로 풀면
가령 비동기 구간을 setTimeout -> ..... , 1000 으로 하는 구현을 해보자.
Rx.Observable.create (observable)->요건 Promise로 풀면
# callback block
setTimeout ->
observable.onNext "<결과값>"
, 1000
.subscribe (res)->
console.log res
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도 같이 비교해도 봐야하지 않을까 싶어서 보니
이전 글(http://spectrumdig.blogspot.kr/2016/07/generator.html)처럼 Promise를 쓸 수 있지만 그럴거면 그냥 다 Promise로 하는게 낫지 않나 하는 생각도 들고.
이곳의 소스는 모두 여기(http://decaffeinate-project.org/repl/) 에서 돌려볼 수 있다.
req=(url)->req가 impure 한 function이 되는게 맘에 걸린다. 어째서 생성시점 이전에 외부의 it를 받아서 .next를 하는 걸까.
setTimeout ->
it.next(url.length)
, 1000
main=-> console.log yield req "hohoho bababa"
it=main()
it.next()
이전 글(http://spectrumdig.blogspot.kr/2016/07/generator.html)처럼 Promise를 쓸 수 있지만 그럴거면 그냥 다 Promise로 하는게 낫지 않나 하는 생각도 들고.
이곳의 소스는 모두 여기(http://decaffeinate-project.org/repl/) 에서 돌려볼 수 있다.
댓글
댓글 쓰기