Coming from Other Languages
This page describes parallels of using promises in other languages. Promises as a pattern are very common in other languages and knowing what they map to in other languages might help you with grasping them conceptually
C#
A promise is similar to a C# Task
. They both represent the result of an operation.
A promise's then
method is similar to a Task's ContinueWith
method in that both allow attaching a continuation to the promise. Bluebird's Promise.coroutine
is analogous to C#'s async/await
syntax.
A TaskCompletionSource
is analogous to the promise constructor. Although usually promisification is preferred (see the API reference or working with callbacks section).
Task.FromResult
is analogous to Promise.resolve
.
The difference between a Task
and a promise are that a task might not be started and might require a .Start
call where a promise always represents an already started operation.
In addition promises are always unwrapped. A promise implicitly has Task.Unwrap
called on it - that is, promises perform recursive assimilation of promises within them.
See this question on StackOverflow for more differences.
Scala
A bluebird promise is similar to a Scala Future
. A scala Promise
is similar to how the promise constructor can be used (previously, to a bluebird Deferred).
Just like a future, a promise represents a value over time. The value can resolve to either a fulfilled (ok completion) or rejected (error completion) state.
Where blocking on a Future in scala is discouraged, in JavaScript it's downright impossible.
In addition promises are always unwrapped. That is, promises perform recursive assimilation of promises within them. You can't have a Promise<Promise<T>>
where a Future[Future[T]]
is valid in Scala.
See this question on StackOverflow for more differences.
Python
A promise is similar to a Twisted Deferred object. In fact the first JavaScript implementations of promises were based on it. However, the APIs have diverged since. The mental model is still very similar.
A promise is not similar to a Python concurrent.Future
which does not chain actions.
Asyncio coroutines are similar to bluebird coroutines in what they let you do, however bluebird coroutines also enable functional-style chaining.
C++
A bluebird promise is similar to a std::future
and the promise constructor is similar to an std::promise
although it should rarely be used in practice (see the promisification section).
However, a bluebird promise is more powerful than the current implementation of std::future
since while chaining has been discussed it is not yet implemented. Promises can be chained together.
Boost futures expose a .then
method similar to promises and allow this functionality.
Haskell
A promise is a monadic construct with .then
filling the role of >>=
(bind). The major difference is that .then
performs recursive assimilation which acts like a flatMap
or a map. The type signature of then
is quote complicated. If we omit the error argument and not throw - it's similar to:
then::Promise a -> (a -> (Either (Promise b) b)) -> Promise b
That is, you can return either a promise or a plain value from a then
without wrapping it.
Promises perform a role similar to IO
in that they allow for easy chaining of asynchronous non-blocking operations. Promise.coroutine
can be seen as similar to do
notation although in practice it's not an accurate comparison.
Java
A promise is similar to a guava Future
with chain
being similar to then
.
If your'e familiar with Java 8 lambdas, you can think of a promise as a Future
you can map
to another future.
Android Java
Several popular Android libraries use promises - for example the Parse Java API returns Task
s which are similar to JavaScript promises.
Objective-C
If you're familiar with PromiseKit, it is based on a same specification bluebird is based on so the API should feel familiar right away.