Summary
In this chapter, we learned that Clojure futures leave a lot to be desired. More specifically, Clojure futures don't provide a way to express dependencies between results. It doesn't mean, however, that we should dismiss futures altogether.
They are still a useful abstraction and with the right semantics for asynchronous computations and a rich set of combinators—such as the ones provided by imminent—they can be a big ally in building reactive applications that are performant and responsive. Sometimes, this is all we need.
For the times where we need to model data that varies over time, we turn to richer frameworks inspired by Functional Reactive Programming (FRP) and Compositional Event Systems (CES) —such as RxJava—or Communicating Sequential Processes (CSP) —such as core.async
. As they have a lot more to offer, much of this book has been dedicated to those approaches.
In the next chapter, we will go back to discussing FRP/CES by way of a case study.