Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns promise-test.core
- (:require-macros [cljs.core.async.macros :refer [go]])
- (:require [cljs.core.async :refer [<! timeout chan put!]]))
- (def delay-ms 100)
- (defn async [n & [f]]
- (go
- (<! (timeout delay-ms))
- ((or f identity) n)))
- (defn square [n]
- (* n n))
- (defn serial [x]
- (go
- (let [n (<! (async x))
- n-squared (<! (async x square))]
- (+ n n-squared))))
- (defn parallel [x]
- (go
- (let [n-chan (async x)
- n-squared-chan (async x square)
- [n n-squared] (<! (cljs.core.async/map vector [n-chan n-squared-chan]))]
- (+ n n-squared))))
- ;; helpers for working with promises in CLJS
- (defn soon
- "Simulate an asynchronous result"
- ([v] (soon v identity))
- ([v f] (js/Promise. (fn [resolve]
- (js/setTimeout #(resolve (f v))
- delay-ms)))))
- (defn promise-to-chan [promise]
- (let [channel (chan)]
- (.then promise #(put! channel %))
- channel))
- (defn serial2 [x]
- (go
- (let [n (<! (promise-to-chan (soon x)))
- n-squared (<! (promise-to-chan (soon x square)))]
- (+ n n-squared))))
- (defn parallel2 [x]
- (go
- (let [n-chan (promise-to-chan (soon x))
- n-squared-chan (promise-to-chan (soon x square))
- [n n-squared] (<! (cljs.core.async/map vector [n-chan n-squared-chan]))]
- (+ n n-squared))))
- (go
- (js/console.time "serial")
- (js.console.log "serial:" (<! (serial 5)))
- (js/console.timeEnd "serial") ; => ~200ms
- (js/console.time "parallel")
- (js.console.log "parallel:" (<! (parallel 5)))
- (js/console.timeEnd "parallel") ; => ~100ms
- (js/console.time "serial2")
- (js.console.log "serial2:" (<! (serial2 5)))
- (js/console.timeEnd "serial2") ; => ~200ms
- (js/console.time "parallel2")
- (js.console.log "parallel2:" (<! (parallel2 5)))
- (js/console.timeEnd "parallel2")) ; => ~100ms
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement