Here is an implementation of promises in D:
It attempts to implement the Promises/A+ standard as closely as possible.
Some thoughts about promises in D:
async functions transparently return a promise, and
await accepts a promise and "synchronously" waits for it to resolve, converting failures into thrown exceptions.
D doesn't have async/await (and, probably adding it would require a significant amount of work in the compiler), but D does have fibers. An interesting observation is that the same principles of async/await and promise interaction also apply to fibers: a task running in a fiber can be represented as a promise, and, in the fiber world,
await is just a simple function which yields the fiber and wakes it up when the promise resolves (also converting failures into thrown exceptions).
Fibers do have overhead in terms of requiring the stack allocation per task and the cost of context switching, so they may not be the best solution all of the time. So, although an asynchronous networking / event loop library could just build everything on fibers (as older versions of Vibe.d have), it would seem that you could instead use promises as the lower-overhead "glue", and make fibers opt-in.