The result will hopefully already be available when needed, and the async call will be made only once.
fooFuture = fetchFoo !_
# anytime when needed:
foo = fooFuture _ # supports multiple calls!
The async call will again be made only once, but it won't happen until it's needed.
barFuture = null
# anytime when needed:
barFuture or= fetchBar !_
bar = barFuture _ # like pattern 1 above
Futures are already caching their result!