deliver

added
1.1

ns
clojure.core

type
function

(deliver promise val)

Delivers the supplied value to the promise, releasing any pending
derefs. A subsequent call to deliver on a promise will have no effect.

                user=> (def x (promise))
#'user/x
;; Trying to deref at this point will make your repl wait forever


user=> (deliver x 100)
#<core$promise$reify__5534@4369a50b: 100>

;; the promise has been delivered, deref x will return immediately
user=> @x
100

            
                ;; Create a promise
user> (def p (promise))
#'user/p ; p is our promise

;; Check if was delivered/realized
user> (realized? p)
false ; No yet

;; Delivering the promise
user> (deliver p 42)
#<core$promise$reify__5727@47122d: 42>

;; Check again if it was delivered
user> (realized? p)
true ; Yes!

;; Deref to see what has been delivered
user> @p
42

;; Note that @ is shorthand for deref
user> (deref p)
42
            
                ;; Illustrates how threads can work together via promises
;; First, an example to show a future that delivers

user=> (def p (promise))
#'user/p

;; future that will deliver the promise from another thread after 10 sec delay
user=> (future
         (Thread/sleep 10000)
         (deliver p 123))
#future[{:status :pending, :val nil} 0x9a51df1]

;; within 10 seconds dereference p, and wait for delivery of the value
user=> @p
123


;; Now, an example to show a future that blocks while waiting for a promise
;; to be delivered -- this is used to achieve callback-style functionality

;; redefine p
user=> (def p (promise))
#'user/p

;; create a new 'callback' thread that will wait for a promise to be delivered
user=> (future
         (println "About to block while waiting for 'p'")
         (println "Now I can do some work with the value " @p))
About to block while waiting for 'p'
#future[{:status :pending, :val nil} 0x1737df29]

;; deliver the promise, triggering the blocking callback thread
user=> (deliver p 123)
Now I can do some work with the value  123
#promise[{:status :ready, :val 123} 0x674a4c4a]