Skip to content


Subversion checkout URL

You can clone with
Download ZIP
A solid, fast Promises/A+ and when() implementation, plus other async goodies.
JavaScript HTML

Merge pull request #461 from cujojs/fix-460

Add better example
latest commit 3e05cb71c9
@briancavalier briancavalier authored
Failed to load latest commit information.
benchmark Disable unhandled rejection reports in benchmarks
build Add when.node alias to browserify build. Update README
docs Add better example
es6-shim Update changelog, rebuild shim
lib Switch isNode check to avoid problem with webpack
monitor squash commit for IE 8 fix
node Close #249. Move when/node/function to when/node. Add when/node/funct…
test Make settle unreport already-rejected promises. Fix #423
unfold Add Object.create shim so that es6-shim/Promise is ES3 compatible. Ad…
.editorconfig Allow developers to use the tabstop they prefer
.gitignore Yield to platform before reporting unhandled rejections to allow time
.jshintignore Yield to platform before reporting unhandled rejections to allow time
.jshintrc Update jshintrc to appease jshint 2.6
.npmignore Yield to platform before reporting unhandled rejections to allow time
.travis.yml Travis seems to be broken for node 0.8 atm Update changelog, rebuild shim run-script > run
LICENSE.txt Adding license file Fixed a typo in the readme
bower.json Remove moot `version` property from bower.json
callbacks.js Fix regression with when/callbacks
cancelable.js Clean up umd
delay.js Minor cleanup. Rebuild es6-shim
function.js Improve lift and reduce perf.
generator.js Improve generator perf and mem usage
guard.js Flatten guard and thread thisarg
keys.js Add when.filter. Pass array indices in and when.filter, keys
monitor.js Fully externalize unhandled rejection tracking, even long stack trace…
node.js Improve lift and reduce perf.
package.json update license attribute
parallel.js Minor cleanup
pipeline.js Minor cleanup
poll.js Update naming to match #438
sequence.js Minor cleanup
timeout.js Minor cleanup. Rebuild es6-shim
unfold.js Move unfold-test to generate-test, add stub for iterate tests
when.js Bump version

Promises/A+ logo

Build Status Inline docs


When.js is a rock solid, battle-tested Promises/A+ and when() 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 when through bower, or just clone the repo and load when.js 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 "drat!" if there was a problem. It also uses rest to make an ajax request to a (fictional) external service.

var rest = require('rest');

    .done(function(greeting) {

function fetchRemoteGreeting() {
    // returns a when.js promise for 'hello world'
    return rest('');

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 150 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) {

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.

Something went wrong with that request. Please try again.