#mpromise
A promises/A+ conformant implementation, written for mongoose.
installation
$ npm install mpromise
docs
An mpromise
can be in any of three states, pending, fulfilled (success), or rejected (error). Once it is either fulfilled or rejected it's state can no longer be changed.
The exports object is the Promise constructor.
var Promise = require('mpromise');
The constructor accepts an optional function which is executed when the promise is first resolved (either fulfilled or rejected).
var promise = new Promise(fn);
This is the same as passing the fn
to onResolve
directly.
var promise = new Promise;
promise.onResolve(function (err, args..) {
...
});
Methods
####fulfill
Fulfilling a promise with values:
var promise = new Promise;
promise.fulfill(args...);
If the promise has already been fulfilled or rejected, no action is taken.
####reject
Rejecting a promise with a reason:
var promise = new Promise;
promise.reject(reason);
If the promise has already been fulfilled or rejected, no action is taken.
####resolve
Node.js callback style promise resolution (err, args...)
:
var promise = new Promise;
promise.resolve([reason], [arg1, arg2, ...]);
If the promise has already been fulfilled or rejected, no action is taken.
####onFulfill
To register a function for execution when the promise is fulfilled, pass it to onFulfill
. When executed it will receive the arguments passed to fulfill()
.
var promise = new Promise;
promise.onFulfill(function (a, b) {
assert.equal(3, a + b);
});
promise.fulfill(1, 2);
The function will only be called once when the promise is fulfilled, never when rejected.
Registering a function with onFulfill
after the promise has already been fulfilled results in the immediate execution of the function with the original arguments used to fulfill the promise.
var promise = new Promise;
promise.fulfill(" :D ");
promise.onFulfill(function (arg) {
console.log(arg);
})
####onReject
To register a function for execution when the promise is rejected, pass it to onReject
. When executed it will receive the argument passed to reject()
.
var promise = new Promise;
promise.onReject(function (reason) {
assert.equal('sad', reason);
});
promise.reject('sad');
The function will only be called once when the promise is rejected, never when fulfilled.
Registering a function with onReject
after the promise has already been rejected results in the immediate execution of the function with the original argument used to reject the promise.
var promise = new Promise;
promise.reject(" :( ");
promise.onReject(function (reason) {
console.log(reason);
})
####onResolve
Allows registration of node.js style callbacks (err, args..)
to handle either promise resolution type (fulfill or reject).
var promise = new Promise;
promise.onResolve(function (err, a, b) {
console.log(a + b);
});
promise.fulfill(1, 2);
var promise = new Promise;
promise.onResolve(function (err) {
if (err) {
console.log(err.message);
}
});
promise.reject(new Error('failed'));
####then
Creates a new promise and returns it. If onFulfill
or onReject
are passed, they are added as SUCCESS/ERROR callbacks to this promise after the nextTick.
Conforms to promises/A+ specification and passes its tests.
var p = new Promise;
p.then(function (arg) {
return arg + 1;
}).then(function (arg) {
throw new Error(arg + ' is an error!');
}).then(null, function (err) {
assert.ok(err instanceof Error);
assert.equal('2 is an error', err.message);
});
p.complete(1);
####end
Signifies that this promise was the last in a chain of then()s
: if a handler passed to the call to then
which produced this promise throws, the exception will go uncaught.
var p = new Promise;
p.then(function(){ throw new Error('shucks') });
setTimeout(function () {
p.fulfill();
}, 10);
var p = new Promise;
var p2 = p.then(function(){ throw new Error('shucks') }).end();
setTimeout(function () {
p.fulfill();
}, 10);
###Event names
If you'd like to alter this implementations event names used to signify success and failure you may do so by setting Promise.SUCCESS
or Promise.FAILURE
respectively.
Promise.SUCCESS = 'complete';
Promise.FAILURE = 'err';
###Luke, use the Source
For more ideas read the source, tests, or the mongoose implementation.
license
MIT