|
|
/*! * 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(); * * DEPRECATED. Mongoose 5.0 will use native promises by default (or bluebird, * if native promises are not present) but still * support plugging in your own ES6-compatible promises library. Mongoose 5.0 * will **not** support mpromise. * * @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 * @deprecated */
function Promise(fn) { MPromise.call(this, fn); }
/** * ES6-style promise constructor wrapper around mpromise. * * @param {Function} resolver * @return {Promise} new promise * @api public */ Promise.ES6 = function(resolver) { var promise = new Promise();
// No try/catch for backwards compatibility
resolver( function() { promise.complete.apply(promise, arguments); }, function(e) { promise.error(e); });
return promise; };
/*! * Inherit from mpromise */
Promise.prototype = Object.create(MPromise.prototype, { constructor: { value: Promise, enumerable: false, writable: true, configurable: true } });
/*! * ignore */
Promise.prototype.then = util.deprecate(Promise.prototype.then, 'Mongoose: mpromise (mongoose\'s default promise library) is deprecated, ' + 'plug in your own promise library instead: ' + 'http://mongoosejs.com/docs/promises.html');
/** * ES6-style `.catch()` shorthand * * @method catch * @memberOf Promise * @param {Function} onReject * @return {Promise} * @api public */
Promise.prototype.catch = function(onReject) { return this.then(null, onReject); };
/*! * 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 * @deprecated */
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 * @deprecated */
/** * 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 * @deprecated */
/** * 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 * @deprecated */
/*! * expose */
module.exports = Promise;
|