UNPKG

7.47 kBMarkdownView Raw
1<a href="https://promisesaplus.com/"><img src="https://promisesaplus.com/assets/logo-small.png" align="right" /></a>
2# promise
3
4This is a simple implementation of Promises. It is a super set of ES6 Promises designed to have readable, performant code and to provide just the extensions that are absolutely necessary for using promises today.
5
6For detailed tutorials on its use, see www.promisejs.org
7
8**N.B.** This promise exposes internals via underscore (`_`) prefixed properties. If you use these, your code will break with each new release.
9
10[![travis][travis-image]][travis-url]
11[![dep][dep-image]][dep-url]
12[![npm][npm-image]][npm-url]
13[![downloads][downloads-image]][downloads-url]
14
15[travis-image]: https://img.shields.io/travis/then/promise.svg?style=flat
16[travis-url]: https://travis-ci.org/then/promise
17[dep-image]: https://img.shields.io/gemnasium/then/promise.svg?style=flat
18[dep-url]: https://gemnasium.com/then/promise
19[npm-image]: https://img.shields.io/npm/v/promise.svg?style=flat
20[npm-url]: https://npmjs.org/package/promise
21[downloads-image]: https://img.shields.io/npm/dm/promise.svg?style=flat
22[downloads-url]: https://npmjs.org/package/promise
23
24## Installation
25
26**Server:**
27
28 $ npm install promise
29
30**Client:**
31
32You can use browserify on the client, or use the pre-compiled script that acts as a polyfill.
33
34```html
35<script src="https://www.promisejs.org/polyfills/promise-6.1.0.js"></script>
36```
37
38Note that the [es5-shim](https://github.com/es-shims/es5-shim) must be loaded before this library to support browsers pre IE9.
39
40```html
41<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/3.4.0/es5-shim.min.js"></script>
42```
43
44## Usage
45
46The example below shows how you can load the promise library (in a way that works on both client and server using node or browserify). It then demonstrates creating a promise from scratch. You simply call `new Promise(fn)`. There is a complete specification for what is returned by this method in [Promises/A+](http://promises-aplus.github.com/promises-spec/).
47
48```javascript
49var Promise = require('promise');
50
51var promise = new Promise(function (resolve, reject) {
52 get('http://www.google.com', function (err, res) {
53 if (err) reject(err);
54 else resolve(res);
55 });
56});
57```
58
59If you need [domains](https://iojs.org/api/domain.html) support, you should instead use:
60
61```js
62var Promise = require('promise/domains');
63```
64
65If you are in an environment that implements `setImmediate` and don't want the optimisations provided by asap, you can use:
66
67```js
68var Promise = require('promise/setimmediate');
69```
70
71If you only want part of the features, e.g. just a pure ES6 polyfill:
72
73```js
74var Promise = require('promise/lib/es6-extensions');
75// or require('promise/domains/es6-extensions');
76// or require('promise/setimmediate/es6-extensions');
77```
78
79## API
80
81Before all examples, you will need:
82
83```js
84var Promise = require('promise');
85```
86
87### new Promise(resolver)
88
89This creates and returns a new promise. `resolver` must be a function. The `resolver` function is passed two arguments:
90
91 1. `resolve` should be called with a single argument. If it is called with a non-promise value then the promise is fulfilled with that value. If it is called with a promise (A) then the returned promise takes on the state of that new promise (A).
92 2. `reject` should be called with a single argument. The returned promise will be rejected with that argument.
93
94### Static Functions
95
96 These methods are invoked by calling `Promise.methodName`.
97
98#### Promise.resolve(value)
99
100(deprecated aliases: `Promise.from(value)`, `Promise.cast(value)`)
101
102Converts values and foreign promises into Promises/A+ promises. If you pass it a value then it returns a Promise for that value. If you pass it something that is close to a promise (such as a jQuery attempt at a promise) it returns a Promise that takes on the state of `value` (rejected or fulfilled).
103
104#### Promise.reject(value)
105
106Returns a rejected promise with the given value.
107
108#### Promise.all(array)
109
110Returns a promise for an array. If it is called with a single argument that `Array.isArray` then this returns a promise for a copy of that array with any promises replaced by their fulfilled values. e.g.
111
112```js
113Promise.all([Promise.resolve('a'), 'b', Promise.resolve('c')])
114 .then(function (res) {
115 assert(res[0] === 'a')
116 assert(res[1] === 'b')
117 assert(res[2] === 'c')
118 })
119```
120
121#### Promise.denodeify(fn)
122
123_Non Standard_
124
125Takes a function which accepts a node style callback and returns a new function that returns a promise instead.
126
127e.g.
128
129```javascript
130var fs = require('fs')
131
132var read = Promise.denodeify(fs.readFile)
133var write = Promise.denodeify(fs.writeFile)
134
135var p = read('foo.json', 'utf8')
136 .then(function (str) {
137 return write('foo.json', JSON.stringify(JSON.parse(str), null, ' '), 'utf8')
138 })
139```
140
141#### Promise.nodeify(fn)
142
143_Non Standard_
144
145The twin to `denodeify` is useful when you want to export an API that can be used by people who haven't learnt about the brilliance of promises yet.
146
147```javascript
148module.exports = Promise.nodeify(awesomeAPI)
149function awesomeAPI(a, b) {
150 return download(a, b)
151}
152```
153
154If the last argument passed to `module.exports` is a function, then it will be treated like a node.js callback and not parsed on to the child function, otherwise the API will just return a promise.
155
156### Prototype Methods
157
158These methods are invoked on a promise instance by calling `myPromise.methodName`
159
160### Promise#then(onFulfilled, onRejected)
161
162This method follows the [Promises/A+ spec](http://promises-aplus.github.io/promises-spec/). It explains things very clearly so I recommend you read it.
163
164Either `onFulfilled` or `onRejected` will be called and they will not be called more than once. They will be passed a single argument and will always be called asynchronously (in the next turn of the event loop).
165
166If the promise is fulfilled then `onFulfilled` is called. If the promise is rejected then `onRejected` is called.
167
168The call to `.then` also returns a promise. If the handler that is called returns a promise, the promise returned by `.then` takes on the state of that returned promise. If the handler that is called returns a value that is not a promise, the promise returned by `.then` will be fulfilled with that value. If the handler that is called throws an exception then the promise returned by `.then` is rejected with that exception.
169
170#### Promise#catch(onRejected)
171
172Sugar for `Promise#then(null, onRejected)`, to mirror `catch` in synchronous code.
173
174#### Promise#done(onFulfilled, onRejected)
175
176_Non Standard_
177
178The same semantics as `.then` except that it does not return a promise and any exceptions are re-thrown so that they can be logged (crashing the application in non-browser environments)
179
180#### Promise#nodeify(callback)
181
182_Non Standard_
183
184If `callback` is `null` or `undefined` it just returns `this`. If `callback` is a function it is called with rejection reason as the first argument and result as the second argument (as per the node.js convention).
185
186This lets you write API functions that look like:
187
188```javascript
189function awesomeAPI(foo, bar, callback) {
190 return internalAPI(foo, bar)
191 .then(parseResult)
192 .then(null, retryErrors)
193 .nodeify(callback)
194}
195```
196
197People who use typical node.js style callbacks will be able to just pass a callback and get the expected behavior. The enlightened people can not pass a callback and will get awesome promises.
198
199## License
200
201 MIT