UNPKG

3.54 kBMarkdownView Raw
1<a href="http://promises-aplus.github.com/promises-spec"><img src="http://promises-aplus.github.com/promises-spec/assets/logo-small.png" alt="Promises/A+ logo" align="right" /></a>
2
3[![Build Status](https://travis-ci.org/cujojs/when.png?branch=master)](https://travis-ci.org/cujojs/when)
4
5when.js
6=======
7
8When.js is a rock solid, battle-tested [Promises/A+](http://promises-aplus.github.com/promises-spec) and `when()` implementation, including a complete [ES6 Promise shim](docs/es6-promise-shim.md). It's a powerful combination of small size, high performance, debuggability, and rich features:
9
10* Resolve arrays and hashes of promises, as well as infinite promise sequences
11* Execute tasks in parallel or sequentially
12* Transform Node-style and other callback-based APIs into promise-based APIs
13
14When.js is one of the many stand-alone components of [cujoJS](http://cujojs.com), the JavaScript Architectural Toolkit.
15
16Check it out:
17
18- [What's new](CHANGES.md)
19- [API docs](docs/api.md#api)
20- Read more about how [promises simplify async programming](http://know.cujojs.com/tutorials/async/simplifying-async-with-promises)
21
22Installation
23------------
24
25#### AMD
26
27Availble as `when` through [bower](http://bower.io), or just clone the repo and load `when.js` from the root.
28
29```
30bower install --save when
31```
32
33#### CommonJS/Node
34
35```
36npm install --save when
37```
38
39[More help & other environments &raquo;](docs/installation.md)
40
41Usage
42-----
43
44Promises 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).
45
46This first example will print `"hello world!!!!"` if all went well, or `"drat!"` if there was a problem. It also uses [rest](https://github.com/cujojs/rest) to make an ajax request to a (fictional) external service.
47
48```js
49var rest = require('rest');
50
51fetchRemoteGreeting()
52 .then(addExclamation)
53 .catch(handleError)
54 .done(function(greeting) {
55 console.log(greeting);
56 });
57
58function fetchRemoteGreeting() {
59 // returns a when.js promise for 'hello world'
60 return rest('http://example.com/greeting');
61}
62
63function addExclamation(greeting) {
64 return greeting + '!!!!'
65}
66
67function handleError(e) {
68 return 'drat!';
69}
70```
71
72The 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.
73
74```js
75var when = require('when');
76var rest = require('rest');
77
78when.reduce(when.map(getRemoteNumberList(), times10), sum)
79 .done(function(result) {
80 console.log(result);
81 });
82
83function getRemoteNumberList() {
84 // Get a remote array [1, 2, 3, 4, 5]
85 return rest('http://example.com/numbers').then(JSON.parse);
86}
87
88function sum(x, y) { return x + y; }
89function times10(x) {return x * 10; }
90```
91
92License
93-------
94
95Licensed under MIT. [Full license here &raquo;](LICENSE.txt)
96
97Contributing
98------------
99
100Please see the [contributing guide](CONTRIBUTING.md) for more information on running tests, opening issues, and contributing code to the project.
101
102References
103----------
104
105Much of this code was inspired by the async innards of [wire.js](https://github.com/cujojs/wire), and has been influenced by the great work in [Q](https://github.com/kriskowal/q), [Dojo's Deferred](https://github.com/dojo/dojo), and [uber.js](https://github.com/phiggins42/uber.js).