123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- /*!
- * Module dependencies
- */
- var MPromise = require('mpromise');
- var util = require('util');
- /**
- * Promise constructor.
- *
- * Promises are returned from executed queries. Example:
- *
- * var query = Candy.find({ bar: true });
- * var promise = query.exec();
- *
- * @param {Function} fn a function which will be called when the promise is resolved that accepts `fn(err, ...){}` as signature
- * @inherits mpromise https://github.com/aheckmann/mpromise
- * @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter
- * @event `err`: Emits when the promise is rejected
- * @event `complete`: Emits when the promise is fulfilled
- * @api public
- */
- function Promise (fn) {
- MPromise.call(this, fn);
- }
- /*!
- * Inherit from mpromise
- */
- Promise.prototype = Object.create(MPromise.prototype, {
- constructor: {
- value: Promise
- , enumerable: false
- , writable: true
- , configurable: true
- }
- });
- /*!
- * Override event names for backward compatibility.
- */
- Promise.SUCCESS = 'complete';
- Promise.FAILURE = 'err';
- /**
- * Adds `listener` to the `event`.
- *
- * If `event` is either the success or failure event and the event has already been emitted, the`listener` is called immediately and passed the results of the original emitted event.
- *
- * @see mpromise#on https://github.com/aheckmann/mpromise#on
- * @method on
- * @memberOf Promise
- * @param {String} event
- * @param {Function} listener
- * @return {Promise} this
- * @api public
- */
- /**
- * Rejects this promise with `reason`.
- *
- * If the promise has already been fulfilled or rejected, not action is taken.
- *
- * @see mpromise#reject https://github.com/aheckmann/mpromise#reject
- * @method reject
- * @memberOf Promise
- * @param {Object|String|Error} reason
- * @return {Promise} this
- * @api public
- */
- /**
- * Rejects this promise with `err`.
- *
- * If the promise has already been fulfilled or rejected, not action is taken.
- *
- * Differs from [#reject](#promise_Promise-reject) by first casting `err` to an `Error` if it is not `instanceof Error`.
- *
- * @api public
- * @param {Error|String} err
- * @return {Promise} this
- */
- Promise.prototype.error = function (err) {
- if (!(err instanceof Error)) {
- if (err instanceof Object) {
- err = util.inspect(err);
- }
- err = new Error(err);
- }
- return this.reject(err);
- }
- /**
- * Resolves this promise to a rejected state if `err` is passed or a fulfilled state if no `err` is passed.
- *
- * If the promise has already been fulfilled or rejected, not action is taken.
- *
- * `err` will be cast to an Error if not already instanceof Error.
- *
- * _NOTE: overrides [mpromise#resolve](https://github.com/aheckmann/mpromise#resolve) to provide error casting._
- *
- * @param {Error} [err] error or null
- * @param {Object} [val] value to fulfill the promise with
- * @api public
- */
- Promise.prototype.resolve = function (err) {
- if (err) return this.error(err);
- return this.fulfill.apply(this, Array.prototype.slice.call(arguments, 1));
- };
- /**
- * Adds a single function as a listener to both err and complete.
- *
- * It will be executed with traditional node.js argument position when the promise is resolved.
- *
- * promise.addBack(function (err, args...) {
- * if (err) return handleError(err);
- * console.log('success');
- * })
- *
- * Alias of [mpromise#onResolve](https://github.com/aheckmann/mpromise#onresolve).
- *
- * _Deprecated. Use `onResolve` instead._
- *
- * @method addBack
- * @param {Function} listener
- * @return {Promise} this
- * @deprecated
- */
- Promise.prototype.addBack = Promise.prototype.onResolve;
- /**
- * Fulfills this promise with passed arguments.
- *
- * @method fulfill
- * @receiver Promise
- * @see https://github.com/aheckmann/mpromise#fulfill
- * @param {any} args
- * @api public
- */
- /**
- * Fulfills this promise with passed arguments.
- *
- * Alias of [mpromise#fulfill](https://github.com/aheckmann/mpromise#fulfill).
- *
- * _Deprecated. Use `fulfill` instead._
- *
- * @method complete
- * @receiver Promise
- * @param {any} args
- * @api public
- * @deprecated
- */
- Promise.prototype.complete = MPromise.prototype.fulfill;
- /**
- * Adds a listener to the `complete` (success) event.
- *
- * Alias of [mpromise#onFulfill](https://github.com/aheckmann/mpromise#onfulfill).
- *
- * _Deprecated. Use `onFulfill` instead._
- *
- * @method addCallback
- * @param {Function} listener
- * @return {Promise} this
- * @api public
- * @deprecated
- */
- Promise.prototype.addCallback = Promise.prototype.onFulfill;
- /**
- * Adds a listener to the `err` (rejected) event.
- *
- * Alias of [mpromise#onReject](https://github.com/aheckmann/mpromise#onreject).
- *
- * _Deprecated. Use `onReject` instead._
- *
- * @method addErrback
- * @param {Function} listener
- * @return {Promise} this
- * @api public
- * @deprecated
- */
- Promise.prototype.addErrback = Promise.prototype.onReject;
- /**
- * 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+](https://github.com/promises-aplus/promises-spec) specification.
- *
- * ####Example:
- *
- * var promise = Meetups.find({ tags: 'javascript' }).select('_id').exec();
- * promise.then(function (meetups) {
- * var ids = meetups.map(function (m) {
- * return m._id;
- * });
- * return People.find({ meetups: { $in: ids }).exec();
- * }).then(function (people) {
- * if (people.length < 10000) {
- * throw new Error('Too few people!!!');
- * } else {
- * throw new Error('Still need more people!!!');
- * }
- * }).then(null, function (err) {
- * assert.ok(err instanceof Error);
- * });
- *
- * @see promises-A+ https://github.com/promises-aplus/promises-spec
- * @see mpromise#then https://github.com/aheckmann/mpromise#then
- * @method then
- * @memberOf Promise
- * @param {Function} onFulFill
- * @param {Function} onReject
- * @return {Promise} newPromise
- */
- /**
- * 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.
- *
- * ####Example:
- *
- * var p = new Promise;
- * p.then(function(){ throw new Error('shucks') });
- * setTimeout(function () {
- * p.fulfill();
- * // error was caught and swallowed by the promise returned from
- * // p.then(). we either have to always register handlers on
- * // the returned promises or we can do the following...
- * }, 10);
- *
- * // this time we use .end() which prevents catching thrown errors
- * var p = new Promise;
- * var p2 = p.then(function(){ throw new Error('shucks') }).end(); // <--
- * setTimeout(function () {
- * p.fulfill(); // throws "shucks"
- * }, 10);
- *
- * @api public
- * @see mpromise#end https://github.com/aheckmann/mpromise#end
- * @method end
- * @memberOf Promise
- */
- /*!
- * expose
- */
- module.exports = Promise;
|