A solid, fast Promises/A+ and when() implementation, plus other async goodies.
JavaScript HTML
Latest commit 8a7785a Apr 28, 2016 @sachavdb sachavdb committed with briancavalier Make sure MutationObserver is used in Safari as well (#488)
* make sure MutationObserver is used in Safari as well

* explicitly check for 'undefined' instead of using 'window'
Permalink
Failed to load latest commit information.
benchmark Disable unhandled rejection reports in benchmarks Apr 28, 2014
build Add when.node alias to browserify build. Update README Mar 15, 2014
docs Correct promise.tap "equivalent" explanation Feb 15, 2016
es6-shim Bump version, rebuild Dec 24, 2015
lib Make sure MutationObserver is used in Safari as well (#488) Apr 28, 2016
monitor squash commit for IE 8 fix Apr 14, 2015
node Close #249. Move when/node/function to when/node. Add when/node/funct… Feb 13, 2014
test Add implementation for keys.settle Jul 30, 2015
unfold Add Object.create shim so that es6-shim/Promise is ES3 compatible. Ad… Mar 14, 2014
.editorconfig Allow developers to use the tabstop they prefer Nov 21, 2012
.gitignore include browserified and browserified+uglified version in dist for pu… Dec 4, 2015
.jshintignore include browserified and browserified+uglified version in dist for pu… Dec 4, 2015
.jshintrc Update jshintrc to appease jshint 2.6 Jan 25, 2015
.npmignore Yield to platform before reporting unhandled rejections to allow time Jun 4, 2014
.travis.yml Enabling Node 4 and 5 on Travis Apr 13, 2016
CHANGES.md Bump version, rebuild Dec 24, 2015
CONTRIBUTING.md run-script > run Dec 9, 2013
LICENSE.txt Adding license file Apr 20, 2011
README.md Fixed a typo in the readme Apr 1, 2015
bower.json Remove moot `version` property from bower.json Jun 11, 2015
callbacks.js Fix regression with when/callbacks Nov 14, 2014
cancelable.js Clean up umd Mar 12, 2014
delay.js Minor cleanup. Rebuild es6-shim May 14, 2014
function.js Improve lift and reduce perf. Nov 10, 2014
generator.js Improve generator perf and mem usage Nov 6, 2014
guard.js Flatten guard and thread thisarg Jun 4, 2014
keys.js Unindent helper function. Aug 6, 2015
monitor.js Fully externalize unhandled rejection tracking, even long stack trace… Apr 28, 2014
node.js Improve lift and reduce perf. Nov 10, 2014
package.json Updating microtime dependency (so that microtime installs on Node 4 a… Apr 13, 2016
parallel.js Minor cleanup Mar 14, 2014
pipeline.js Minor cleanup Mar 14, 2014
poll.js Update naming to match #438 Mar 27, 2015
sequence.js Minor cleanup Mar 14, 2014
timeout.js Minor cleanup. Rebuild es6-shim May 14, 2014
unfold.js Move unfold-test to generate-test, add stub for iterate tests Feb 14, 2014
when.js Bump version Apr 20, 2015

README.md

Promises/A+ logo

Build Status Inline docs

when.js

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:

Installation

AMD

Available as when through bower, or just clone the repo and load when.js from the root.

bower install --save when

CommonJS/Node

npm install --save when

More help & other environments »

Usage

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');

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

function fetchRemoteGreeting() {
    // returns a when.js promise for 'hello world'
    return rest('http://example.com/greeting');
}

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(when.map(getRemoteNumberList(), times10), sum)
    .done(function(result) {
        console.log(result);
    });

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

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

License

Licensed under MIT. Full license here »

Contributing

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

References

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.