Need help with when?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

3.4K Stars 409 Forks Other 1.6K Commits 67 Opened issues


A solid, fast Promises/A+ and when() implementation, plus other async goodies.

Services available


Need anything else?

Contributors list

Promises/A+ logo

Build Status Inline docs


When.js is a rock solid, battle-tested Promises/A+ and

implementation, including a complete ES6 Promise shim. It's a powerful combination of small size, high performance, debuggability, and rich features:
  • Resolve arrays and hashes of promises, as well as infinite promise sequences
  • Execute tasks in parallel or sequentially
  • Transform Node-style and other callback-based APIs into promise-based APIs

When.js is one of the many stand-alone components of cujoJS, the JavaScript Architectural Toolkit.

Check it out:



Available as

through bower, or just clone the repo and load
from the root.
bower install --save when


npm install --save when

More help & other environments »


Promises can be used to help manage complex and/or nested callback flows in a simple manner. To get a better handle on how promise flows look and how they can be helpful, there are a couple examples below (using commonjs).

This first example will print

"hello world!!!!"
if all went well, or
if there was a problem. It also uses rest to make an ajax request to a (fictional) external service.
var rest = require('rest');

fetchRemoteGreeting() .then(addExclamation) .catch(handleError) .done(function(greeting) { console.log(greeting); });

function fetchRemoteGreeting() { // convert native Promise to a when.js promise for 'hello world' var result = rest(''); return when(result) }

function addExclamation(greeting) { return greeting + '!!!!' }

function handleError(e) { return 'drat!'; }

The second example shows off the power that comes with when's promise logic. Here, we get an array of numbers from a remote source and reduce them. The example will print

if all went well, and if there was a problem will print a full stack trace.
var when = require('when');
var rest = require('rest');

when.reduce(, times10), sum) .done(function(result) { console.log(result); });

function getRemoteNumberList() { // Get a remote array [1, 2, 3, 4, 5] return rest('').then(JSON.parse); }

function sum(x, y) { return x + y; } function times10(x) {return x * 10; }


Licensed under MIT. Full license here »


Please see the contributing guide for more information on running tests, opening issues, and contributing code to the project.


Much of this code was inspired by the async innards of wire.js, and has been influenced by the great work in Q, Dojo's Deferred, and uber.js.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.