Skip to content
This repository

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

Octocat-spinner-32 benchmark Use more sensible names for cycle error and forever pending promise March 07, 2014
Octocat-spinner-32 build Add when.node alias to browserify build. Update README March 14, 2014
Octocat-spinner-32 docs Update docs. PrettyMonitor compatibility ftw April 04, 2014
Octocat-spinner-32 es6-shim Rebuild es6 shim April 03, 2014
Octocat-spinner-32 lib Skip cycle checking in resolve() when not needed April 02, 2014
Octocat-spinner-32 monitor Make PromiseMonitor call reporter.configurePromiseMonitor if availabl… April 03, 2014
Octocat-spinner-32 node Close #249. Move when/node/function to when/node. Add when/node/funct… February 13, 2014
Octocat-spinner-32 test Make PromiseMonitor call reporter.configurePromiseMonitor if availabl… April 03, 2014
Octocat-spinner-32 unfold Add Object.create shim so that es6-shim/Promise is ES3 compatible. Ad… March 14, 2014
Octocat-spinner-32 .editorconfig Allow developers to use the tabstop they prefer November 21, 2012
Octocat-spinner-32 .gitignore Add test browserify build. Update README with instructions December 02, 2013
Octocat-spinner-32 .jshintignore Add es6 Promise shim. Appease jshint. Remove commented out code March 06, 2014
Octocat-spinner-32 .jshintrc Allow custom rejection reason for promise.timeout() March 26, 2014
Octocat-spinner-32 .npmignore Bump version, add changelog. Clean up npmignore March 24, 2014
Octocat-spinner-32 .travis.yml Remove when3 branch from travis. Temporarily disable saucelabs testin… April 03, 2014
Octocat-spinner-32 CHANGES.md Update changelog April 01, 2014
Octocat-spinner-32 CONTRIBUTING.md run-script > run December 09, 2013
Octocat-spinner-32 LICENSE.txt Adding license file April 19, 2011
Octocat-spinner-32 README.md Add note about debuggability to es6-shim docs. Add note about browser… March 27, 2014
Octocat-spinner-32 bower.json Improve long stack handling in v8. Bump version. March 26, 2014
Octocat-spinner-32 callbacks.js Update README. Simplify internal API March 17, 2014
Octocat-spinner-32 cancelable.js Clean up umd March 12, 2014
Octocat-spinner-32 delay.js Cleanup boilerplate, use newer APIs February 18, 2014
Octocat-spinner-32 function.js Clean up and reformat in general. Add iterate and reduceRight tests. … March 14, 2014
Octocat-spinner-32 generator.js Make es6-shim work even when loaded in a module system, eg curl prelo… March 06, 2014
Octocat-spinner-32 guard.js Dont capture arguments object March 21, 2014
Octocat-spinner-32 keys.js Dont capture pending in keys.all March 20, 2014
Octocat-spinner-32 node.js Update README. Simplify internal API March 17, 2014
Octocat-spinner-32 package.json Improve long stack handling in v8. Bump version. March 26, 2014
Octocat-spinner-32 parallel.js Minor cleanup March 14, 2014
Octocat-spinner-32 pipeline.js Minor cleanup March 14, 2014
Octocat-spinner-32 poll.js Add liftAll variants February 19, 2014
Octocat-spinner-32 sequence.js Minor cleanup March 14, 2014
Octocat-spinner-32 timeout.js Cleanup boilerplate, use newer APIs February 18, 2014
Octocat-spinner-32 unfold.js Move unfold-test to generate-test, add stub for iterate tests February 13, 2014
Octocat-spinner-32 when.js Update file header comment April 03, 2014
README.md

Promises/A+ logo

Build Status

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

Availble 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.

Something went wrong with that request. Please try again.