When.js is cujoJS's lightweight Promises/A+ and when()
implementation that powers the async core of wire.js, cujoJS's IOC Container. It features:
- A rock solid, battle-tested Promise implementation
- Resolving, settling, mapping, and reducing arrays of promises
- Executing tasks in parallel and sequence
- Transforming Node-style and other callback-based APIs into promise-based APIs
It passes the Promises/A+ Test Suite, is very fast, is under 1.5k when compiled with Google Closure + gzip, and has no external dependencies.
- Fix for
when.defer().reject()
bypassing the unhandled rejection monitor. (#166) - Fix for
when/function
,when/callbacks
, andwhen/node/function
not preservingthisArg
. (#162) - Doc clarifications for
promise.yield
. (#164)
- New experimental promise monitoring and debugging via
when/monitor/console
. - New
when.promise(resolver)
promise creation API. A lighter alternative to the heavierwhen.defer()
- New
bindCallback
andliftCallback
inwhen/node/function
for more integration options with node-style callbacks.
- Quote internal usages of
promise.yield
to workaround .NET minifier tools that don't yet understand ES5 identifier-as-property rules. See #157
- New
when.settle
that settles an array of promises - New
when/guard
generalized concurrency guarding and limiting - New
promise.inspect
for synchronously getting a snapshot of a promise's state at a particular instant. - Significant performance improvements when resolving promises with non-primitives (e.g. with Arrays, Objects, etc.)
- Experimental vert.x support
- DEPRECATED:
onFulfilled
,onRejected
,onProgress
handler arguments towhen.all
,when.any
,when.some
. Use the returned promise'sthen()
(orotherwise()
,ensure()
, etc) to register handlers instead.- For example, do this:
when.all(array).then(onFulfilled, onRejected)
instead of this:when.all(array, onFulfilled, onRejected)
. The functionality is equivalent.
- For example, do this:
- Account for the fact that Mocha creates a global named
process
. Thanks Narsul
- Fully asynchronous resolutions.
- Promises/A+ compliance.
- New
when/keys
module withall()
andmap()
for object keys/values. - New
promise.ensure
as a better, and safer, replacement forpromise.always
. See discussion as to whypromise.always
is mistake-prone.- DEPRECATED:
promise.always
- DEPRECATED:
lift()
is now the preferred name for what wasbind()
in when/function, when/node/function, and when/callbacks.- DEPRECATED:
bind()
inwhen/function
,when/node/function
, andwhen/callbacks
. Uselift()
instead.
- DEPRECATED:
-
Get it
bower install when
oryeoman install when
, orgit clone https://github.com/cujojs/when
orgit submodule add https://github.com/cujojs/when
-
Configure your loader with a package:
packages: [ { name: 'when', location: 'path/to/when/', main: 'when' }, // ... other packages ... ]
-
define(['when', ...], function(when, ...) { ... });
orrequire(['when', ...], function(when, ...) { ... });
npm install when
var when = require('when');
ringo-admin install cujojs/when
var when = require('when');
-
git clone https://github.com/cujojs/when
orgit submodule add https://github.com/cujojs/when
-
Add a transient
define
shim, and a<script>
element for when.js<script> window.define = function(factory) { try{ delete window.define; } catch(e){ window.define = void 0; } // IE window.when = factory(); }; window.define.amd = {}; </script> <script src="path/to/when/when.js"></script>
-
when
will be available aswindow.when
Note that when.js includes the Promises/A+ Test Suite. Running unit tests in Node will run both when.js's own test suite, and the Promises/A+ Test Suite.
npm install
npm test
npm install
npm start
- starts buster server & prints a url- Point browsers at /capture, e.g.
localhost:1111/capture
npm run-script test-browser
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.