(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]