2560 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			2560 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /*! | |||
|  |  * @overview RSVP - a tiny implementation of Promises/A+. | |||
|  |  * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors | |||
|  |  * @license   Licensed under MIT license | |||
|  |  *            See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE
 | |||
|  |  * @version   4.8.4+ff10049b | |||
|  |  */ | |||
|  | 
 | |||
|  | (function (global, factory) { | |||
|  |   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | |||
|  |   typeof define === 'function' && define.amd ? define(['exports'], factory) : | |||
|  |   (factory((global.RSVP = {}))); | |||
|  | }(this, (function (exports) { 'use strict'; | |||
|  | 
 | |||
|  |   function callbacksFor(object) { | |||
|  |     var callbacks = object._promiseCallbacks; | |||
|  | 
 | |||
|  |     if (!callbacks) { | |||
|  |       callbacks = object._promiseCallbacks = {}; | |||
|  |     } | |||
|  | 
 | |||
|  |     return callbacks; | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     @class EventTarget | |||
|  |     @for rsvp | |||
|  |     @public | |||
|  |   */ | |||
|  |   var EventTarget = { | |||
|  | 
 | |||
|  |     /** | |||
|  |       `EventTarget.mixin` extends an object with EventTarget methods. For | |||
|  |       Example: | |||
|  |        ```javascript
 | |||
|  |       import EventTarget from 'rsvp'; | |||
|  |        let object = {}; | |||
|  |        EventTarget.mixin(object); | |||
|  |        object.on('finished', function(event) { | |||
|  |         // handle event
 | |||
|  |       }); | |||
|  |        object.trigger('finished', { detail: value }); | |||
|  |       ```
 | |||
|  |        `EventTarget.mixin` also works with prototypes: | |||
|  |        ```javascript
 | |||
|  |       import EventTarget from 'rsvp'; | |||
|  |        let Person = function() {}; | |||
|  |       EventTarget.mixin(Person.prototype); | |||
|  |        let yehuda = new Person(); | |||
|  |       let tom = new Person(); | |||
|  |        yehuda.on('poke', function(event) { | |||
|  |         console.log('Yehuda says OW'); | |||
|  |       }); | |||
|  |        tom.on('poke', function(event) { | |||
|  |         console.log('Tom says OW'); | |||
|  |       }); | |||
|  |        yehuda.trigger('poke'); | |||
|  |       tom.trigger('poke'); | |||
|  |       ```
 | |||
|  |        @method mixin | |||
|  |       @for rsvp | |||
|  |       @private | |||
|  |       @param {Object} object object to extend with EventTarget methods | |||
|  |     */ | |||
|  |     mixin: function (object) { | |||
|  |       object.on = this.on; | |||
|  |       object.off = this.off; | |||
|  |       object.trigger = this.trigger; | |||
|  |       object._promiseCallbacks = undefined; | |||
|  |       return object; | |||
|  |     }, | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |       Registers a callback to be executed when `eventName` is triggered | |||
|  |        ```javascript
 | |||
|  |       object.on('event', function(eventInfo){ | |||
|  |         // handle the event
 | |||
|  |       }); | |||
|  |        object.trigger('event'); | |||
|  |       ```
 | |||
|  |        @method on | |||
|  |       @for EventTarget | |||
|  |       @private | |||
|  |       @param {String} eventName name of the event to listen for | |||
|  |       @param {Function} callback function to be called when the event is triggered. | |||
|  |     */ | |||
|  |     on: function (eventName, callback) { | |||
|  |       if (typeof callback !== 'function') { | |||
|  |         throw new TypeError('Callback must be a function'); | |||
|  |       } | |||
|  | 
 | |||
|  |       var allCallbacks = callbacksFor(this); | |||
|  |       var callbacks = allCallbacks[eventName]; | |||
|  | 
 | |||
|  |       if (!callbacks) { | |||
|  |         callbacks = allCallbacks[eventName] = []; | |||
|  |       } | |||
|  | 
 | |||
|  |       if (callbacks.indexOf(callback) === -1) { | |||
|  |         callbacks.push(callback); | |||
|  |       } | |||
|  |     }, | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |       You can use `off` to stop firing a particular callback for an event: | |||
|  |        ```javascript
 | |||
|  |       function doStuff() { // do stuff! }
 | |||
|  |       object.on('stuff', doStuff); | |||
|  |        object.trigger('stuff'); // doStuff will be called
 | |||
|  |        // Unregister ONLY the doStuff callback
 | |||
|  |       object.off('stuff', doStuff); | |||
|  |       object.trigger('stuff'); // doStuff will NOT be called
 | |||
|  |       ```
 | |||
|  |        If you don't pass a `callback` argument to `off`, ALL callbacks for the | |||
|  |       event will not be executed when the event fires. For example: | |||
|  |        ```javascript
 | |||
|  |       let callback1 = function(){}; | |||
|  |       let callback2 = function(){}; | |||
|  |        object.on('stuff', callback1); | |||
|  |       object.on('stuff', callback2); | |||
|  |        object.trigger('stuff'); // callback1 and callback2 will be executed.
 | |||
|  |        object.off('stuff'); | |||
|  |       object.trigger('stuff'); // callback1 and callback2 will not be executed!
 | |||
|  |       ```
 | |||
|  |        @method off | |||
|  |       @for rsvp | |||
|  |       @private | |||
|  |       @param {String} eventName event to stop listening to | |||
|  |       @param {Function} [callback] optional argument. If given, only the function | |||
|  |       given will be removed from the event's callback queue. If no `callback` | |||
|  |       argument is given, all callbacks will be removed from the event's callback | |||
|  |       queue. | |||
|  |     */ | |||
|  |     off: function (eventName, callback) { | |||
|  |       var allCallbacks = callbacksFor(this); | |||
|  | 
 | |||
|  |       if (!callback) { | |||
|  |         allCallbacks[eventName] = []; | |||
|  |         return; | |||
|  |       } | |||
|  | 
 | |||
|  |       var callbacks = allCallbacks[eventName]; | |||
|  |       var index = callbacks.indexOf(callback); | |||
|  | 
 | |||
|  |       if (index !== -1) { | |||
|  |         callbacks.splice(index, 1); | |||
|  |       } | |||
|  |     }, | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |       Use `trigger` to fire custom events. For example: | |||
|  |        ```javascript
 | |||
|  |       object.on('foo', function(){ | |||
|  |         console.log('foo event happened!'); | |||
|  |       }); | |||
|  |       object.trigger('foo'); | |||
|  |       // 'foo event happened!' logged to the console
 | |||
|  |       ```
 | |||
|  |        You can also pass a value as a second argument to `trigger` that will be | |||
|  |       passed as an argument to all event listeners for the event: | |||
|  |        ```javascript
 | |||
|  |       object.on('foo', function(value){ | |||
|  |         console.log(value.name); | |||
|  |       }); | |||
|  |        object.trigger('foo', { name: 'bar' }); | |||
|  |       // 'bar' logged to the console
 | |||
|  |       ```
 | |||
|  |        @method trigger | |||
|  |       @for rsvp | |||
|  |       @private | |||
|  |       @param {String} eventName name of the event to be triggered | |||
|  |       @param {*} [options] optional value to be passed to any event handlers for | |||
|  |       the given `eventName` | |||
|  |     */ | |||
|  |     trigger: function (eventName, options, label) { | |||
|  |       var allCallbacks = callbacksFor(this); | |||
|  | 
 | |||
|  |       var callbacks = allCallbacks[eventName]; | |||
|  |       if (callbacks) { | |||
|  |         // Don't cache the callbacks.length since it may grow
 | |||
|  |         var callback = void 0; | |||
|  |         for (var i = 0; i < callbacks.length; i++) { | |||
|  |           callback = callbacks[i]; | |||
|  |           callback(options, label); | |||
|  |         } | |||
|  |       } | |||
|  |     } | |||
|  |   }; | |||
|  | 
 | |||
|  |   var config = { | |||
|  |     instrument: false | |||
|  |   }; | |||
|  | 
 | |||
|  |   EventTarget['mixin'](config); | |||
|  | 
 | |||
|  |   function configure(name, value) { | |||
|  |     if (arguments.length === 2) { | |||
|  |       config[name] = value; | |||
|  |     } else { | |||
|  |       return config[name]; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   var queue = []; | |||
|  | 
 | |||
|  |   function scheduleFlush() { | |||
|  |     setTimeout(function () { | |||
|  |       for (var i = 0; i < queue.length; i++) { | |||
|  |         var entry = queue[i]; | |||
|  | 
 | |||
|  |         var payload = entry.payload; | |||
|  | 
 | |||
|  |         payload.guid = payload.key + payload.id; | |||
|  |         payload.childGuid = payload.key + payload.childId; | |||
|  |         if (payload.error) { | |||
|  |           payload.stack = payload.error.stack; | |||
|  |         } | |||
|  | 
 | |||
|  |         config['trigger'](entry.name, entry.payload); | |||
|  |       } | |||
|  |       queue.length = 0; | |||
|  |     }, 50); | |||
|  |   } | |||
|  | 
 | |||
|  |   function instrument(eventName, promise, child) { | |||
|  |     if (1 === queue.push({ | |||
|  |       name: eventName, | |||
|  |       payload: { | |||
|  |         key: promise._guidKey, | |||
|  |         id: promise._id, | |||
|  |         eventName: eventName, | |||
|  |         detail: promise._result, | |||
|  |         childId: child && child._id, | |||
|  |         label: promise._label, | |||
|  |         timeStamp: Date.now(), | |||
|  |         error: config["instrument-with-stack"] ? new Error(promise._label) : null | |||
|  |       } })) { | |||
|  |       scheduleFlush(); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     `Promise.resolve` returns a promise that will become resolved with the | |||
|  |     passed `value`. It is shorthand for the following: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise = new Promise(function(resolve, reject){ | |||
|  |       resolve(1); | |||
|  |     }); | |||
|  | 
 | |||
|  |     promise.then(function(value){ | |||
|  |       // value === 1
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Instead of writing the above, your code now simply becomes the following: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise = RSVP.Promise.resolve(1); | |||
|  | 
 | |||
|  |     promise.then(function(value){ | |||
|  |       // value === 1
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method resolve | |||
|  |     @for Promise | |||
|  |     @static | |||
|  |     @param {*} object value that the returned promise will be resolved with | |||
|  |     @param {String} [label] optional string for identifying the returned promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} a promise that will become fulfilled with the given | |||
|  |     `value` | |||
|  |   */ | |||
|  |   function resolve$$1(object, label) { | |||
|  |     /*jshint validthis:true */ | |||
|  |     var Constructor = this; | |||
|  | 
 | |||
|  |     if (object && typeof object === 'object' && object.constructor === Constructor) { | |||
|  |       return object; | |||
|  |     } | |||
|  | 
 | |||
|  |     var promise = new Constructor(noop, label); | |||
|  |     resolve$1(promise, object); | |||
|  |     return promise; | |||
|  |   } | |||
|  | 
 | |||
|  |   function withOwnPromise() { | |||
|  |     return new TypeError('A promises callback cannot return that same promise.'); | |||
|  |   } | |||
|  | 
 | |||
|  |   function objectOrFunction(x) { | |||
|  |     var type = typeof x; | |||
|  |     return x !== null && (type === 'object' || type === 'function'); | |||
|  |   } | |||
|  | 
 | |||
|  |   function noop() {} | |||
|  | 
 | |||
|  |   var PENDING = void 0; | |||
|  |   var FULFILLED = 1; | |||
|  |   var REJECTED = 2; | |||
|  | 
 | |||
|  |   var TRY_CATCH_ERROR = { error: null }; | |||
|  | 
 | |||
|  |   function getThen(promise) { | |||
|  |     try { | |||
|  |       return promise.then; | |||
|  |     } catch (error) { | |||
|  |       TRY_CATCH_ERROR.error = error; | |||
|  |       return TRY_CATCH_ERROR; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   var tryCatchCallback = void 0; | |||
|  |   function tryCatcher() { | |||
|  |     try { | |||
|  |       var target = tryCatchCallback; | |||
|  |       tryCatchCallback = null; | |||
|  |       return target.apply(this, arguments); | |||
|  |     } catch (e) { | |||
|  |       TRY_CATCH_ERROR.error = e; | |||
|  |       return TRY_CATCH_ERROR; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function tryCatch(fn) { | |||
|  |     tryCatchCallback = fn; | |||
|  |     return tryCatcher; | |||
|  |   } | |||
|  | 
 | |||
|  |   function handleForeignThenable(promise, thenable, then$$1) { | |||
|  |     config.async(function (promise) { | |||
|  |       var sealed = false; | |||
|  |       var result = tryCatch(then$$1).call(thenable, function (value) { | |||
|  |         if (sealed) { | |||
|  |           return; | |||
|  |         } | |||
|  |         sealed = true; | |||
|  |         if (thenable === value) { | |||
|  |           fulfill(promise, value); | |||
|  |         } else { | |||
|  |           resolve$1(promise, value); | |||
|  |         } | |||
|  |       }, function (reason) { | |||
|  |         if (sealed) { | |||
|  |           return; | |||
|  |         } | |||
|  |         sealed = true; | |||
|  | 
 | |||
|  |         reject(promise, reason); | |||
|  |       }, 'Settle: ' + (promise._label || ' unknown promise')); | |||
|  | 
 | |||
|  |       if (!sealed && result === TRY_CATCH_ERROR) { | |||
|  |         sealed = true; | |||
|  |         var error = TRY_CATCH_ERROR.error; | |||
|  |         TRY_CATCH_ERROR.error = null; | |||
|  |         reject(promise, error); | |||
|  |       } | |||
|  |     }, promise); | |||
|  |   } | |||
|  | 
 | |||
|  |   function handleOwnThenable(promise, thenable) { | |||
|  |     if (thenable._state === FULFILLED) { | |||
|  |       fulfill(promise, thenable._result); | |||
|  |     } else if (thenable._state === REJECTED) { | |||
|  |       thenable._onError = null; | |||
|  |       reject(promise, thenable._result); | |||
|  |     } else { | |||
|  |       subscribe(thenable, undefined, function (value) { | |||
|  |         if (thenable === value) { | |||
|  |           fulfill(promise, value); | |||
|  |         } else { | |||
|  |           resolve$1(promise, value); | |||
|  |         } | |||
|  |       }, function (reason) { | |||
|  |         return reject(promise, reason); | |||
|  |       }); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function handleMaybeThenable(promise, maybeThenable, then$$1) { | |||
|  |     var isOwnThenable = maybeThenable.constructor === promise.constructor && then$$1 === then && promise.constructor.resolve === resolve$$1; | |||
|  | 
 | |||
|  |     if (isOwnThenable) { | |||
|  |       handleOwnThenable(promise, maybeThenable); | |||
|  |     } else if (then$$1 === TRY_CATCH_ERROR) { | |||
|  |       var error = TRY_CATCH_ERROR.error; | |||
|  |       TRY_CATCH_ERROR.error = null; | |||
|  |       reject(promise, error); | |||
|  |     } else if (typeof then$$1 === 'function') { | |||
|  |       handleForeignThenable(promise, maybeThenable, then$$1); | |||
|  |     } else { | |||
|  |       fulfill(promise, maybeThenable); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function resolve$1(promise, value) { | |||
|  |     if (promise === value) { | |||
|  |       fulfill(promise, value); | |||
|  |     } else if (objectOrFunction(value)) { | |||
|  |       handleMaybeThenable(promise, value, getThen(value)); | |||
|  |     } else { | |||
|  |       fulfill(promise, value); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function publishRejection(promise) { | |||
|  |     if (promise._onError) { | |||
|  |       promise._onError(promise._result); | |||
|  |     } | |||
|  | 
 | |||
|  |     publish(promise); | |||
|  |   } | |||
|  | 
 | |||
|  |   function fulfill(promise, value) { | |||
|  |     if (promise._state !== PENDING) { | |||
|  |       return; | |||
|  |     } | |||
|  | 
 | |||
|  |     promise._result = value; | |||
|  |     promise._state = FULFILLED; | |||
|  | 
 | |||
|  |     if (promise._subscribers.length === 0) { | |||
|  |       if (config.instrument) { | |||
|  |         instrument('fulfilled', promise); | |||
|  |       } | |||
|  |     } else { | |||
|  |       config.async(publish, promise); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function reject(promise, reason) { | |||
|  |     if (promise._state !== PENDING) { | |||
|  |       return; | |||
|  |     } | |||
|  |     promise._state = REJECTED; | |||
|  |     promise._result = reason; | |||
|  |     config.async(publishRejection, promise); | |||
|  |   } | |||
|  | 
 | |||
|  |   function subscribe(parent, child, onFulfillment, onRejection) { | |||
|  |     var subscribers = parent._subscribers; | |||
|  |     var length = subscribers.length; | |||
|  | 
 | |||
|  |     parent._onError = null; | |||
|  | 
 | |||
|  |     subscribers[length] = child; | |||
|  |     subscribers[length + FULFILLED] = onFulfillment; | |||
|  |     subscribers[length + REJECTED] = onRejection; | |||
|  | 
 | |||
|  |     if (length === 0 && parent._state) { | |||
|  |       config.async(publish, parent); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function publish(promise) { | |||
|  |     var subscribers = promise._subscribers; | |||
|  |     var settled = promise._state; | |||
|  | 
 | |||
|  |     if (config.instrument) { | |||
|  |       instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise); | |||
|  |     } | |||
|  | 
 | |||
|  |     if (subscribers.length === 0) { | |||
|  |       return; | |||
|  |     } | |||
|  | 
 | |||
|  |     var child = void 0, | |||
|  |         callback = void 0, | |||
|  |         result = promise._result; | |||
|  | 
 | |||
|  |     for (var i = 0; i < subscribers.length; i += 3) { | |||
|  |       child = subscribers[i]; | |||
|  |       callback = subscribers[i + settled]; | |||
|  | 
 | |||
|  |       if (child) { | |||
|  |         invokeCallback(settled, child, callback, result); | |||
|  |       } else { | |||
|  |         callback(result); | |||
|  |       } | |||
|  |     } | |||
|  | 
 | |||
|  |     promise._subscribers.length = 0; | |||
|  |   } | |||
|  | 
 | |||
|  |   function invokeCallback(state, promise, callback, result) { | |||
|  |     var hasCallback = typeof callback === 'function'; | |||
|  |     var value = void 0; | |||
|  | 
 | |||
|  |     if (hasCallback) { | |||
|  |       value = tryCatch(callback)(result); | |||
|  |     } else { | |||
|  |       value = result; | |||
|  |     } | |||
|  | 
 | |||
|  |     if (promise._state !== PENDING) { | |||
|  |       // noop
 | |||
|  |     } else if (value === promise) { | |||
|  |       reject(promise, withOwnPromise()); | |||
|  |     } else if (value === TRY_CATCH_ERROR) { | |||
|  |       var error = TRY_CATCH_ERROR.error; | |||
|  |       TRY_CATCH_ERROR.error = null; // release
 | |||
|  |       reject(promise, error); | |||
|  |     } else if (hasCallback) { | |||
|  |       resolve$1(promise, value); | |||
|  |     } else if (state === FULFILLED) { | |||
|  |       fulfill(promise, value); | |||
|  |     } else if (state === REJECTED) { | |||
|  |       reject(promise, value); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function initializePromise(promise, resolver) { | |||
|  |     var resolved = false; | |||
|  |     try { | |||
|  |       resolver(function (value) { | |||
|  |         if (resolved) { | |||
|  |           return; | |||
|  |         } | |||
|  |         resolved = true; | |||
|  |         resolve$1(promise, value); | |||
|  |       }, function (reason) { | |||
|  |         if (resolved) { | |||
|  |           return; | |||
|  |         } | |||
|  |         resolved = true; | |||
|  |         reject(promise, reason); | |||
|  |       }); | |||
|  |     } catch (e) { | |||
|  |       reject(promise, e); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   function then(onFulfillment, onRejection, label) { | |||
|  |     var parent = this; | |||
|  |     var state = parent._state; | |||
|  | 
 | |||
|  |     if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) { | |||
|  |       config.instrument && instrument('chained', parent, parent); | |||
|  |       return parent; | |||
|  |     } | |||
|  | 
 | |||
|  |     parent._onError = null; | |||
|  | 
 | |||
|  |     var child = new parent.constructor(noop, label); | |||
|  |     var result = parent._result; | |||
|  | 
 | |||
|  |     config.instrument && instrument('chained', parent, child); | |||
|  | 
 | |||
|  |     if (state === PENDING) { | |||
|  |       subscribe(parent, child, onFulfillment, onRejection); | |||
|  |     } else { | |||
|  |       var callback = state === FULFILLED ? onFulfillment : onRejection; | |||
|  |       config.async(function () { | |||
|  |         return invokeCallback(state, child, callback, result); | |||
|  |       }); | |||
|  |     } | |||
|  | 
 | |||
|  |     return child; | |||
|  |   } | |||
|  | 
 | |||
|  |   var Enumerator = function () { | |||
|  |     function Enumerator(Constructor, input, abortOnReject, label) { | |||
|  |       this._instanceConstructor = Constructor; | |||
|  |       this.promise = new Constructor(noop, label); | |||
|  |       this._abortOnReject = abortOnReject; | |||
|  |       this._isUsingOwnPromise = Constructor === Promise; | |||
|  |       this._isUsingOwnResolve = Constructor.resolve === resolve$$1; | |||
|  | 
 | |||
|  |       this._init.apply(this, arguments); | |||
|  |     } | |||
|  | 
 | |||
|  |     Enumerator.prototype._init = function _init(Constructor, input) { | |||
|  |       var len = input.length || 0; | |||
|  |       this.length = len; | |||
|  |       this._remaining = len; | |||
|  |       this._result = new Array(len); | |||
|  | 
 | |||
|  |       this._enumerate(input); | |||
|  |     }; | |||
|  | 
 | |||
|  |     Enumerator.prototype._enumerate = function _enumerate(input) { | |||
|  |       var length = this.length; | |||
|  |       var promise = this.promise; | |||
|  | 
 | |||
|  |       for (var i = 0; promise._state === PENDING && i < length; i++) { | |||
|  |         this._eachEntry(input[i], i, true); | |||
|  |       } | |||
|  |       this._checkFullfillment(); | |||
|  |     }; | |||
|  | 
 | |||
|  |     Enumerator.prototype._checkFullfillment = function _checkFullfillment() { | |||
|  |       if (this._remaining === 0) { | |||
|  |         var result = this._result; | |||
|  |         fulfill(this.promise, result); | |||
|  |         this._result = null; | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     Enumerator.prototype._settleMaybeThenable = function _settleMaybeThenable(entry, i, firstPass) { | |||
|  |       var c = this._instanceConstructor; | |||
|  | 
 | |||
|  |       if (this._isUsingOwnResolve) { | |||
|  |         var then$$1 = getThen(entry); | |||
|  | 
 | |||
|  |         if (then$$1 === then && entry._state !== PENDING) { | |||
|  |           entry._onError = null; | |||
|  |           this._settledAt(entry._state, i, entry._result, firstPass); | |||
|  |         } else if (typeof then$$1 !== 'function') { | |||
|  |           this._settledAt(FULFILLED, i, entry, firstPass); | |||
|  |         } else if (this._isUsingOwnPromise) { | |||
|  |           var promise = new c(noop); | |||
|  |           handleMaybeThenable(promise, entry, then$$1); | |||
|  |           this._willSettleAt(promise, i, firstPass); | |||
|  |         } else { | |||
|  |           this._willSettleAt(new c(function (resolve) { | |||
|  |             return resolve(entry); | |||
|  |           }), i, firstPass); | |||
|  |         } | |||
|  |       } else { | |||
|  |         this._willSettleAt(c.resolve(entry), i, firstPass); | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     Enumerator.prototype._eachEntry = function _eachEntry(entry, i, firstPass) { | |||
|  |       if (entry !== null && typeof entry === 'object') { | |||
|  |         this._settleMaybeThenable(entry, i, firstPass); | |||
|  |       } else { | |||
|  |         this._setResultAt(FULFILLED, i, entry, firstPass); | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     Enumerator.prototype._settledAt = function _settledAt(state, i, value, firstPass) { | |||
|  |       var promise = this.promise; | |||
|  | 
 | |||
|  |       if (promise._state === PENDING) { | |||
|  |         if (this._abortOnReject && state === REJECTED) { | |||
|  |           reject(promise, value); | |||
|  |         } else { | |||
|  |           this._setResultAt(state, i, value, firstPass); | |||
|  |           this._checkFullfillment(); | |||
|  |         } | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     Enumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) { | |||
|  |       this._remaining--; | |||
|  |       this._result[i] = value; | |||
|  |     }; | |||
|  | 
 | |||
|  |     Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i, firstPass) { | |||
|  |       var _this = this; | |||
|  | 
 | |||
|  |       subscribe(promise, undefined, function (value) { | |||
|  |         return _this._settledAt(FULFILLED, i, value, firstPass); | |||
|  |       }, function (reason) { | |||
|  |         return _this._settledAt(REJECTED, i, reason, firstPass); | |||
|  |       }); | |||
|  |     }; | |||
|  | 
 | |||
|  |     return Enumerator; | |||
|  |   }(); | |||
|  | 
 | |||
|  | 
 | |||
|  |   function setSettledResult(state, i, value) { | |||
|  |     this._remaining--; | |||
|  |     if (state === FULFILLED) { | |||
|  |       this._result[i] = { | |||
|  |         state: 'fulfilled', | |||
|  |         value: value | |||
|  |       }; | |||
|  |     } else { | |||
|  |       this._result[i] = { | |||
|  |         state: 'rejected', | |||
|  |         reason: value | |||
|  |       }; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     `Promise.all` accepts an array of promises, and returns a new promise which | |||
|  |     is fulfilled with an array of fulfillment values for the passed promises, or | |||
|  |     rejected with the reason of the first passed promise to be rejected. It casts all | |||
|  |     elements of the passed iterable to promises as it runs this algorithm. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise, { resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = resolve(1); | |||
|  |     let promise2 = resolve(2); | |||
|  |     let promise3 = resolve(3); | |||
|  |     let promises = [ promise1, promise2, promise3 ]; | |||
|  | 
 | |||
|  |     Promise.all(promises).then(function(array){ | |||
|  |       // The array here would be [ 1, 2, 3 ];
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     If any of the `promises` given to `RSVP.all` are rejected, the first promise | |||
|  |     that is rejected will be given as an argument to the returned promises's | |||
|  |     rejection handler. For example: | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise, { resolve, reject } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = resolve(1); | |||
|  |     let promise2 = reject(new Error("2")); | |||
|  |     let promise3 = reject(new Error("3")); | |||
|  |     let promises = [ promise1, promise2, promise3 ]; | |||
|  | 
 | |||
|  |     Promise.all(promises).then(function(array){ | |||
|  |       // Code here never runs because there are rejected promises!
 | |||
|  |     }, function(error) { | |||
|  |       // error.message === "2"
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method all | |||
|  |     @for Promise | |||
|  |     @param {Array} entries array of promises | |||
|  |     @param {String} [label] optional string for labeling the promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} promise that is fulfilled when all `promises` have been | |||
|  |     fulfilled, or rejected if any of them become rejected. | |||
|  |     @static | |||
|  |   */ | |||
|  |   function all(entries, label) { | |||
|  |     if (!Array.isArray(entries)) { | |||
|  |       return this.reject(new TypeError("Promise.all must be called with an array"), label); | |||
|  |     } | |||
|  |     return new Enumerator(this, entries, true /* abort on reject */, label).promise; | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     `Promise.race` returns a new promise which is settled in the same way as the | |||
|  |     first passed promise to settle. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = new Promise(function(resolve, reject){ | |||
|  |       setTimeout(function(){ | |||
|  |         resolve('promise 1'); | |||
|  |       }, 200); | |||
|  |     }); | |||
|  | 
 | |||
|  |     let promise2 = new Promise(function(resolve, reject){ | |||
|  |       setTimeout(function(){ | |||
|  |         resolve('promise 2'); | |||
|  |       }, 100); | |||
|  |     }); | |||
|  | 
 | |||
|  |     Promise.race([promise1, promise2]).then(function(result){ | |||
|  |       // result === 'promise 2' because it was resolved before promise1
 | |||
|  |       // was resolved.
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     `Promise.race` is deterministic in that only the state of the first | |||
|  |     settled promise matters. For example, even if other promises given to the | |||
|  |     `promises` array argument are resolved, but the first settled promise has | |||
|  |     become rejected before the other promises became fulfilled, the returned | |||
|  |     promise will become rejected: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = new Promise(function(resolve, reject){ | |||
|  |       setTimeout(function(){ | |||
|  |         resolve('promise 1'); | |||
|  |       }, 200); | |||
|  |     }); | |||
|  | 
 | |||
|  |     let promise2 = new Promise(function(resolve, reject){ | |||
|  |       setTimeout(function(){ | |||
|  |         reject(new Error('promise 2')); | |||
|  |       }, 100); | |||
|  |     }); | |||
|  | 
 | |||
|  |     Promise.race([promise1, promise2]).then(function(result){ | |||
|  |       // Code here never runs
 | |||
|  |     }, function(reason){ | |||
|  |       // reason.message === 'promise 2' because promise 2 became rejected before
 | |||
|  |       // promise 1 became fulfilled
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     An example real-world use case is implementing timeouts: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise from 'rsvp'; | |||
|  | 
 | |||
|  |     Promise.race([ajax('foo.json'), timeout(5000)]) | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method race | |||
|  |     @for Promise | |||
|  |     @static | |||
|  |     @param {Array} entries array of promises to observe | |||
|  |     @param {String} [label] optional string for describing the promise returned. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} a promise which settles in the same way as the first passed | |||
|  |     promise to settle. | |||
|  |   */ | |||
|  |   function race(entries, label) { | |||
|  |     /*jshint validthis:true */ | |||
|  |     var Constructor = this; | |||
|  | 
 | |||
|  |     var promise = new Constructor(noop, label); | |||
|  | 
 | |||
|  |     if (!Array.isArray(entries)) { | |||
|  |       reject(promise, new TypeError('Promise.race must be called with an array')); | |||
|  |       return promise; | |||
|  |     } | |||
|  | 
 | |||
|  |     for (var i = 0; promise._state === PENDING && i < entries.length; i++) { | |||
|  |       subscribe(Constructor.resolve(entries[i]), undefined, function (value) { | |||
|  |         return resolve$1(promise, value); | |||
|  |       }, function (reason) { | |||
|  |         return reject(promise, reason); | |||
|  |       }); | |||
|  |     } | |||
|  | 
 | |||
|  |     return promise; | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     `Promise.reject` returns a promise rejected with the passed `reason`. | |||
|  |     It is shorthand for the following: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise = new Promise(function(resolve, reject){ | |||
|  |       reject(new Error('WHOOPS')); | |||
|  |     }); | |||
|  | 
 | |||
|  |     promise.then(function(value){ | |||
|  |       // Code here doesn't run because the promise is rejected!
 | |||
|  |     }, function(reason){ | |||
|  |       // reason.message === 'WHOOPS'
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Instead of writing the above, your code now simply becomes the following: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise = Promise.reject(new Error('WHOOPS')); | |||
|  | 
 | |||
|  |     promise.then(function(value){ | |||
|  |       // Code here doesn't run because the promise is rejected!
 | |||
|  |     }, function(reason){ | |||
|  |       // reason.message === 'WHOOPS'
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method reject | |||
|  |     @for Promise | |||
|  |     @static | |||
|  |     @param {*} reason value that the returned promise will be rejected with. | |||
|  |     @param {String} [label] optional string for identifying the returned promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} a promise rejected with the given `reason`. | |||
|  |   */ | |||
|  |   function reject$1(reason, label) { | |||
|  |     /*jshint validthis:true */ | |||
|  |     var Constructor = this; | |||
|  |     var promise = new Constructor(noop, label); | |||
|  |     reject(promise, reason); | |||
|  |     return promise; | |||
|  |   } | |||
|  | 
 | |||
|  |   var guidKey = 'rsvp_' + Date.now() + '-'; | |||
|  |   var counter = 0; | |||
|  | 
 | |||
|  |   function needsResolver() { | |||
|  |     throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); | |||
|  |   } | |||
|  | 
 | |||
|  |   function needsNew() { | |||
|  |     throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     Promise objects represent the eventual result of an asynchronous operation. The | |||
|  |     primary way of interacting with a promise is through its `then` method, which | |||
|  |     registers callbacks to receive either a promiseās eventual value or the reason | |||
|  |     why the promise cannot be fulfilled. | |||
|  | 
 | |||
|  |     Terminology | |||
|  |     ----------- | |||
|  | 
 | |||
|  |     - `promise` is an object or function with a `then` method whose behavior conforms to this specification. | |||
|  |     - `thenable` is an object or function that defines a `then` method. | |||
|  |     - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). | |||
|  |     - `exception` is a value that is thrown using the throw statement. | |||
|  |     - `reason` is a value that indicates why a promise was rejected. | |||
|  |     - `settled` the final resting state of a promise, fulfilled or rejected. | |||
|  | 
 | |||
|  |     A promise can be in one of three states: pending, fulfilled, or rejected. | |||
|  | 
 | |||
|  |     Promises that are fulfilled have a fulfillment value and are in the fulfilled | |||
|  |     state.  Promises that are rejected have a rejection reason and are in the | |||
|  |     rejected state.  A fulfillment value is never a thenable. | |||
|  | 
 | |||
|  |     Promises can also be said to *resolve* a value.  If this value is also a | |||
|  |     promise, then the original promise's settled state will match the value's | |||
|  |     settled state.  So a promise that *resolves* a promise that rejects will | |||
|  |     itself reject, and a promise that *resolves* a promise that fulfills will | |||
|  |     itself fulfill. | |||
|  | 
 | |||
|  | 
 | |||
|  |     Basic Usage: | |||
|  |     ------------ | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     let promise = new Promise(function(resolve, reject) { | |||
|  |       // on success
 | |||
|  |       resolve(value); | |||
|  | 
 | |||
|  |       // on failure
 | |||
|  |       reject(reason); | |||
|  |     }); | |||
|  | 
 | |||
|  |     promise.then(function(value) { | |||
|  |       // on fulfillment
 | |||
|  |     }, function(reason) { | |||
|  |       // on rejection
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Advanced Usage: | |||
|  |     --------------- | |||
|  | 
 | |||
|  |     Promises shine when abstracting away asynchronous interactions such as | |||
|  |     `XMLHttpRequest`s. | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     function getJSON(url) { | |||
|  |       return new Promise(function(resolve, reject){ | |||
|  |         let xhr = new XMLHttpRequest(); | |||
|  | 
 | |||
|  |         xhr.open('GET', url); | |||
|  |         xhr.onreadystatechange = handler; | |||
|  |         xhr.responseType = 'json'; | |||
|  |         xhr.setRequestHeader('Accept', 'application/json'); | |||
|  |         xhr.send(); | |||
|  | 
 | |||
|  |         function handler() { | |||
|  |           if (this.readyState === this.DONE) { | |||
|  |             if (this.status === 200) { | |||
|  |               resolve(this.response); | |||
|  |             } else { | |||
|  |               reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); | |||
|  |             } | |||
|  |           } | |||
|  |         }; | |||
|  |       }); | |||
|  |     } | |||
|  | 
 | |||
|  |     getJSON('/posts.json').then(function(json) { | |||
|  |       // on fulfillment
 | |||
|  |     }, function(reason) { | |||
|  |       // on rejection
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Unlike callbacks, promises are great composable primitives. | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     Promise.all([ | |||
|  |       getJSON('/posts'), | |||
|  |       getJSON('/comments') | |||
|  |     ]).then(function(values){ | |||
|  |       values[0] // => postsJSON
 | |||
|  |       values[1] // => commentsJSON
 | |||
|  | 
 | |||
|  |       return values; | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @class Promise | |||
|  |     @public | |||
|  |     @param {function} resolver | |||
|  |     @param {String} [label] optional string for labeling the promise. | |||
|  |     Useful for tooling. | |||
|  |     @constructor | |||
|  |   */ | |||
|  | 
 | |||
|  |   var Promise = function () { | |||
|  |     function Promise(resolver, label) { | |||
|  |       this._id = counter++; | |||
|  |       this._label = label; | |||
|  |       this._state = undefined; | |||
|  |       this._result = undefined; | |||
|  |       this._subscribers = []; | |||
|  | 
 | |||
|  |       config.instrument && instrument('created', this); | |||
|  | 
 | |||
|  |       if (noop !== resolver) { | |||
|  |         typeof resolver !== 'function' && needsResolver(); | |||
|  |         this instanceof Promise ? initializePromise(this, resolver) : needsNew(); | |||
|  |       } | |||
|  |     } | |||
|  | 
 | |||
|  |     Promise.prototype._onError = function _onError(reason) { | |||
|  |       var _this = this; | |||
|  | 
 | |||
|  |       config.after(function () { | |||
|  |         if (_this._onError) { | |||
|  |           config.trigger('error', reason, _this._label); | |||
|  |         } | |||
|  |       }); | |||
|  |     }; | |||
|  | 
 | |||
|  |     /** | |||
|  |       `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same | |||
|  |       as the catch block of a try/catch statement. | |||
|  |      | |||
|  |       ```js
 | |||
|  |       function findAuthor(){ | |||
|  |         throw new Error('couldn\'t find that author'); | |||
|  |       } | |||
|  |      | |||
|  |       // synchronous
 | |||
|  |       try { | |||
|  |         findAuthor(); | |||
|  |       } catch(reason) { | |||
|  |         // something went wrong
 | |||
|  |       } | |||
|  |      | |||
|  |       // async with promises
 | |||
|  |       findAuthor().catch(function(reason){ | |||
|  |         // something went wrong
 | |||
|  |       }); | |||
|  |       ```
 | |||
|  |      | |||
|  |       @method catch | |||
|  |       @param {Function} onRejection | |||
|  |       @param {String} [label] optional string for labeling the promise. | |||
|  |       Useful for tooling. | |||
|  |       @return {Promise} | |||
|  |     */ | |||
|  | 
 | |||
|  | 
 | |||
|  |     Promise.prototype.catch = function _catch(onRejection, label) { | |||
|  |       return this.then(undefined, onRejection, label); | |||
|  |     }; | |||
|  | 
 | |||
|  |     /** | |||
|  |       `finally` will be invoked regardless of the promise's fate just as native | |||
|  |       try/catch/finally behaves | |||
|  |      | |||
|  |       Synchronous example: | |||
|  |      | |||
|  |       ```js
 | |||
|  |       findAuthor() { | |||
|  |         if (Math.random() > 0.5) { | |||
|  |           throw new Error(); | |||
|  |         } | |||
|  |         return new Author(); | |||
|  |       } | |||
|  |      | |||
|  |       try { | |||
|  |         return findAuthor(); // succeed or fail
 | |||
|  |       } catch(error) { | |||
|  |         return findOtherAuthor(); | |||
|  |       } finally { | |||
|  |         // always runs
 | |||
|  |         // doesn't affect the return value
 | |||
|  |       } | |||
|  |       ```
 | |||
|  |      | |||
|  |       Asynchronous example: | |||
|  |      | |||
|  |       ```js
 | |||
|  |       findAuthor().catch(function(reason){ | |||
|  |         return findOtherAuthor(); | |||
|  |       }).finally(function(){ | |||
|  |         // author was either found, or not
 | |||
|  |       }); | |||
|  |       ```
 | |||
|  |      | |||
|  |       @method finally | |||
|  |       @param {Function} callback | |||
|  |       @param {String} [label] optional string for labeling the promise. | |||
|  |       Useful for tooling. | |||
|  |       @return {Promise} | |||
|  |     */ | |||
|  | 
 | |||
|  | 
 | |||
|  |     Promise.prototype.finally = function _finally(callback, label) { | |||
|  |       var promise = this; | |||
|  |       var constructor = promise.constructor; | |||
|  | 
 | |||
|  |       if (typeof callback === 'function') { | |||
|  |         return promise.then(function (value) { | |||
|  |           return constructor.resolve(callback()).then(function () { | |||
|  |             return value; | |||
|  |           }); | |||
|  |         }, function (reason) { | |||
|  |           return constructor.resolve(callback()).then(function () { | |||
|  |             throw reason; | |||
|  |           }); | |||
|  |         }); | |||
|  |       } | |||
|  | 
 | |||
|  |       return promise.then(callback, callback); | |||
|  |     }; | |||
|  | 
 | |||
|  |     return Promise; | |||
|  |   }(); | |||
|  | 
 | |||
|  |   Promise.cast = resolve$$1; // deprecated
 | |||
|  |   Promise.all = all; | |||
|  |   Promise.race = race; | |||
|  |   Promise.resolve = resolve$$1; | |||
|  |   Promise.reject = reject$1; | |||
|  | 
 | |||
|  |   Promise.prototype._guidKey = guidKey; | |||
|  | 
 | |||
|  |   /** | |||
|  |     The primary way of interacting with a promise is through its `then` method, | |||
|  |     which registers callbacks to receive either a promise's eventual value or the | |||
|  |     reason why the promise cannot be fulfilled. | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     findUser().then(function(user){ | |||
|  |       // user is available
 | |||
|  |     }, function(reason){ | |||
|  |       // user is unavailable, and you are given the reason why
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Chaining | |||
|  |     -------- | |||
|  | 
 | |||
|  |     The return value of `then` is itself a promise.  This second, 'downstream' | |||
|  |     promise is resolved with the return value of the first promise's fulfillment | |||
|  |     or rejection handler, or rejected if the handler throws an exception. | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     findUser().then(function (user) { | |||
|  |       return user.name; | |||
|  |     }, function (reason) { | |||
|  |       return 'default name'; | |||
|  |     }).then(function (userName) { | |||
|  |       // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
 | |||
|  |       // will be `'default name'`
 | |||
|  |     }); | |||
|  | 
 | |||
|  |     findUser().then(function (user) { | |||
|  |       throw new Error('Found user, but still unhappy'); | |||
|  |     }, function (reason) { | |||
|  |       throw new Error('`findUser` rejected and we\'re unhappy'); | |||
|  |     }).then(function (value) { | |||
|  |       // never reached
 | |||
|  |     }, function (reason) { | |||
|  |       // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
 | |||
|  |       // If `findUser` rejected, `reason` will be '`findUser` rejected and we\'re unhappy'.
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  |     If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     findUser().then(function (user) { | |||
|  |       throw new PedagogicalException('Upstream error'); | |||
|  |     }).then(function (value) { | |||
|  |       // never reached
 | |||
|  |     }).then(function (value) { | |||
|  |       // never reached
 | |||
|  |     }, function (reason) { | |||
|  |       // The `PedgagocialException` is propagated all the way down to here
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Assimilation | |||
|  |     ------------ | |||
|  | 
 | |||
|  |     Sometimes the value you want to propagate to a downstream promise can only be | |||
|  |     retrieved asynchronously. This can be achieved by returning a promise in the | |||
|  |     fulfillment or rejection handler. The downstream promise will then be pending | |||
|  |     until the returned promise is settled. This is called *assimilation*. | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     findUser().then(function (user) { | |||
|  |       return findCommentsByAuthor(user); | |||
|  |     }).then(function (comments) { | |||
|  |       // The user's comments are now available
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     If the assimliated promise rejects, then the downstream promise will also reject. | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     findUser().then(function (user) { | |||
|  |       return findCommentsByAuthor(user); | |||
|  |     }).then(function (comments) { | |||
|  |       // If `findCommentsByAuthor` fulfills, we'll have the value here
 | |||
|  |     }, function (reason) { | |||
|  |       // If `findCommentsByAuthor` rejects, we'll have the reason here
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Simple Example | |||
|  |     -------------- | |||
|  | 
 | |||
|  |     Synchronous Example | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let result; | |||
|  | 
 | |||
|  |     try { | |||
|  |       result = findResult(); | |||
|  |       // success
 | |||
|  |     } catch(reason) { | |||
|  |       // failure
 | |||
|  |     } | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Errback Example | |||
|  | 
 | |||
|  |     ```js
 | |||
|  |     findResult(function(result, err){ | |||
|  |       if (err) { | |||
|  |         // failure
 | |||
|  |       } else { | |||
|  |         // success
 | |||
|  |       } | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Promise Example; | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     findResult().then(function(result){ | |||
|  |       // success
 | |||
|  |     }, function(reason){ | |||
|  |       // failure
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Advanced Example | |||
|  |     -------------- | |||
|  | 
 | |||
|  |     Synchronous Example | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let author, books; | |||
|  | 
 | |||
|  |     try { | |||
|  |       author = findAuthor(); | |||
|  |       books  = findBooksByAuthor(author); | |||
|  |       // success
 | |||
|  |     } catch(reason) { | |||
|  |       // failure
 | |||
|  |     } | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Errback Example | |||
|  | 
 | |||
|  |     ```js
 | |||
|  | 
 | |||
|  |     function foundBooks(books) { | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  |     function failure(reason) { | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  |     findAuthor(function(author, err){ | |||
|  |       if (err) { | |||
|  |         failure(err); | |||
|  |         // failure
 | |||
|  |       } else { | |||
|  |         try { | |||
|  |           findBoooksByAuthor(author, function(books, err) { | |||
|  |             if (err) { | |||
|  |               failure(err); | |||
|  |             } else { | |||
|  |               try { | |||
|  |                 foundBooks(books); | |||
|  |               } catch(reason) { | |||
|  |                 failure(reason); | |||
|  |               } | |||
|  |             } | |||
|  |           }); | |||
|  |         } catch(error) { | |||
|  |           failure(err); | |||
|  |         } | |||
|  |         // success
 | |||
|  |       } | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Promise Example; | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     findAuthor(). | |||
|  |       then(findBooksByAuthor). | |||
|  |       then(function(books){ | |||
|  |         // found books
 | |||
|  |     }).catch(function(reason){ | |||
|  |       // something went wrong
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method then | |||
|  |     @param {Function} onFulfillment | |||
|  |     @param {Function} onRejection | |||
|  |     @param {String} [label] optional string for labeling the promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} | |||
|  |   */ | |||
|  |   Promise.prototype.then = then; | |||
|  | 
 | |||
|  |   function makeObject(_, argumentNames) { | |||
|  |     var obj = {}; | |||
|  |     var length = _.length; | |||
|  |     var args = new Array(length); | |||
|  | 
 | |||
|  |     for (var x = 0; x < length; x++) { | |||
|  |       args[x] = _[x]; | |||
|  |     } | |||
|  | 
 | |||
|  |     for (var i = 0; i < argumentNames.length; i++) { | |||
|  |       var name = argumentNames[i]; | |||
|  |       obj[name] = args[i + 1]; | |||
|  |     } | |||
|  | 
 | |||
|  |     return obj; | |||
|  |   } | |||
|  | 
 | |||
|  |   function arrayResult(_) { | |||
|  |     var length = _.length; | |||
|  |     var args = new Array(length - 1); | |||
|  | 
 | |||
|  |     for (var i = 1; i < length; i++) { | |||
|  |       args[i - 1] = _[i]; | |||
|  |     } | |||
|  | 
 | |||
|  |     return args; | |||
|  |   } | |||
|  | 
 | |||
|  |   function wrapThenable(then, promise) { | |||
|  |     return { | |||
|  |       then: function (onFulFillment, onRejection) { | |||
|  |         return then.call(promise, onFulFillment, onRejection); | |||
|  |       } | |||
|  |     }; | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     `denodeify` takes a 'node-style' function and returns a function that | |||
|  |     will return an `Promise`. You can use `denodeify` in Node.js or the | |||
|  |     browser when you'd prefer to use promises over using callbacks. For example, | |||
|  |     `denodeify` transforms the following: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let fs = require('fs'); | |||
|  | 
 | |||
|  |     fs.readFile('myfile.txt', function(err, data){ | |||
|  |       if (err) return handleError(err); | |||
|  |       handleData(data); | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     into: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let fs = require('fs'); | |||
|  |     let readFile = denodeify(fs.readFile); | |||
|  | 
 | |||
|  |     readFile('myfile.txt').then(handleData, handleError); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     If the node function has multiple success parameters, then `denodeify` | |||
|  |     just returns the first one: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let request = denodeify(require('request')); | |||
|  | 
 | |||
|  |     request('http://example.com').then(function(res) { | |||
|  |       // ...
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     However, if you need all success parameters, setting `denodeify`'s | |||
|  |     second parameter to `true` causes it to return all success parameters | |||
|  |     as an array: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let request = denodeify(require('request'), true); | |||
|  | 
 | |||
|  |     request('http://example.com').then(function(result) { | |||
|  |       // result[0] -> res
 | |||
|  |       // result[1] -> body
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Or if you pass it an array with names it returns the parameters as a hash: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let request = denodeify(require('request'), ['res', 'body']); | |||
|  | 
 | |||
|  |     request('http://example.com').then(function(result) { | |||
|  |       // result.res
 | |||
|  |       // result.body
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Sometimes you need to retain the `this`: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let app = require('express')(); | |||
|  |     let render = denodeify(app.render.bind(app)); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     The denodified function inherits from the original function. It works in all | |||
|  |     environments, except IE 10 and below. Consequently all properties of the original | |||
|  |     function are available to you. However, any properties you change on the | |||
|  |     denodeified function won't be changed on the original function. Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let request = denodeify(require('request')), | |||
|  |         cookieJar = request.jar(); // <- Inheritance is used here
 | |||
|  | 
 | |||
|  |     request('http://example.com', {jar: cookieJar}).then(function(res) { | |||
|  |       // cookieJar.cookies holds now the cookies returned by example.com
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     Using `denodeify` makes it easier to compose asynchronous operations instead | |||
|  |     of using callbacks. For example, instead of: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let fs = require('fs'); | |||
|  | 
 | |||
|  |     fs.readFile('myfile.txt', function(err, data){ | |||
|  |       if (err) { ... } // Handle error
 | |||
|  |       fs.writeFile('myfile2.txt', data, function(err){ | |||
|  |         if (err) { ... } // Handle error
 | |||
|  |         console.log('done') | |||
|  |       }); | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     you can chain the operations together using `then` from the returned promise: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let fs = require('fs'); | |||
|  |     let readFile = denodeify(fs.readFile); | |||
|  |     let writeFile = denodeify(fs.writeFile); | |||
|  | 
 | |||
|  |     readFile('myfile.txt').then(function(data){ | |||
|  |       return writeFile('myfile2.txt', data); | |||
|  |     }).then(function(){ | |||
|  |       console.log('done') | |||
|  |     }).catch(function(error){ | |||
|  |       // Handle error
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method denodeify | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {Function} nodeFunc a 'node-style' function that takes a callback as | |||
|  |     its last argument. The callback expects an error to be passed as its first | |||
|  |     argument (if an error occurred, otherwise null), and the value from the | |||
|  |     operation as its second argument ('function(err, value){ }'). | |||
|  |     @param {Boolean|Array} [options] An optional paramter that if set | |||
|  |     to `true` causes the promise to fulfill with the callback's success arguments | |||
|  |     as an array. This is useful if the node function has multiple success | |||
|  |     paramters. If you set this paramter to an array with names, the promise will | |||
|  |     fulfill with a hash with these names as keys and the success parameters as | |||
|  |     values. | |||
|  |     @return {Function} a function that wraps `nodeFunc` to return a `Promise` | |||
|  |   */ | |||
|  |   function denodeify(nodeFunc, options) { | |||
|  |     var fn = function () { | |||
|  |       var l = arguments.length; | |||
|  |       var args = new Array(l + 1); | |||
|  |       var promiseInput = false; | |||
|  | 
 | |||
|  |       for (var i = 0; i < l; ++i) { | |||
|  |         var arg = arguments[i]; | |||
|  | 
 | |||
|  |         if (!promiseInput) { | |||
|  |           // TODO: clean this up
 | |||
|  |           promiseInput = needsPromiseInput(arg); | |||
|  |           if (promiseInput === TRY_CATCH_ERROR) { | |||
|  |             var error = TRY_CATCH_ERROR.error; | |||
|  |             TRY_CATCH_ERROR.error = null; | |||
|  |             var p = new Promise(noop); | |||
|  |             reject(p, error); | |||
|  |             return p; | |||
|  |           } else if (promiseInput && promiseInput !== true) { | |||
|  |             arg = wrapThenable(promiseInput, arg); | |||
|  |           } | |||
|  |         } | |||
|  |         args[i] = arg; | |||
|  |       } | |||
|  | 
 | |||
|  |       var promise = new Promise(noop); | |||
|  | 
 | |||
|  |       args[l] = function (err, val) { | |||
|  |         if (err) { | |||
|  |           reject(promise, err); | |||
|  |         } else if (options === undefined) { | |||
|  |           resolve$1(promise, val); | |||
|  |         } else if (options === true) { | |||
|  |           resolve$1(promise, arrayResult(arguments)); | |||
|  |         } else if (Array.isArray(options)) { | |||
|  |           resolve$1(promise, makeObject(arguments, options)); | |||
|  |         } else { | |||
|  |           resolve$1(promise, val); | |||
|  |         } | |||
|  |       }; | |||
|  | 
 | |||
|  |       if (promiseInput) { | |||
|  |         return handlePromiseInput(promise, args, nodeFunc, this); | |||
|  |       } else { | |||
|  |         return handleValueInput(promise, args, nodeFunc, this); | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     fn.__proto__ = nodeFunc; | |||
|  | 
 | |||
|  |     return fn; | |||
|  |   } | |||
|  | 
 | |||
|  |   function handleValueInput(promise, args, nodeFunc, self) { | |||
|  |     var result = tryCatch(nodeFunc).apply(self, args); | |||
|  |     if (result === TRY_CATCH_ERROR) { | |||
|  |       var error = TRY_CATCH_ERROR.error; | |||
|  |       TRY_CATCH_ERROR.error = null; | |||
|  |       reject(promise, error); | |||
|  |     } | |||
|  |     return promise; | |||
|  |   } | |||
|  | 
 | |||
|  |   function handlePromiseInput(promise, args, nodeFunc, self) { | |||
|  |     return Promise.all(args).then(function (args) { | |||
|  |       return handleValueInput(promise, args, nodeFunc, self); | |||
|  |     }); | |||
|  |   } | |||
|  | 
 | |||
|  |   function needsPromiseInput(arg) { | |||
|  |     if (arg !== null && typeof arg === 'object') { | |||
|  |       if (arg.constructor === Promise) { | |||
|  |         return true; | |||
|  |       } else { | |||
|  |         return getThen(arg); | |||
|  |       } | |||
|  |     } else { | |||
|  |       return false; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     This is a convenient alias for `Promise.all`. | |||
|  | 
 | |||
|  |     @method all | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {Array} array Array of promises. | |||
|  |     @param {String} [label] An optional label. This is useful | |||
|  |     for tooling. | |||
|  |   */ | |||
|  |   function all$1(array, label) { | |||
|  |     return Promise.all(array, label); | |||
|  |   } | |||
|  | 
 | |||
|  |   function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | |||
|  | 
 | |||
|  |   function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | |||
|  | 
 | |||
|  |   /** | |||
|  |   @module rsvp | |||
|  |   @public | |||
|  |   **/ | |||
|  | 
 | |||
|  |   var AllSettled = function (_Enumerator) { | |||
|  |     _inherits(AllSettled, _Enumerator); | |||
|  | 
 | |||
|  |     function AllSettled(Constructor, entries, label) { | |||
|  |       return _possibleConstructorReturn(this, _Enumerator.call(this, Constructor, entries, false /* don't abort on reject */, label)); | |||
|  |     } | |||
|  | 
 | |||
|  |     return AllSettled; | |||
|  |   }(Enumerator); | |||
|  | 
 | |||
|  |   AllSettled.prototype._setResultAt = setSettledResult; | |||
|  | 
 | |||
|  |   /** | |||
|  |   `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing | |||
|  |   a fail-fast method, it waits until all the promises have returned and | |||
|  |   shows you all the results. This is useful if you want to handle multiple | |||
|  |   promises' failure states together as a set. | |||
|  |    Returns a promise that is fulfilled when all the given promises have been | |||
|  |   settled. The return promise is fulfilled with an array of the states of | |||
|  |   the promises passed into the `promises` array argument. | |||
|  |    Each state object will either indicate fulfillment or rejection, and | |||
|  |   provide the corresponding value or reason. The states will take one of | |||
|  |   the following formats: | |||
|  |    ```javascript
 | |||
|  |   { state: 'fulfilled', value: value } | |||
|  |     or | |||
|  |   { state: 'rejected', reason: reason } | |||
|  |   ```
 | |||
|  |    Example: | |||
|  |    ```javascript
 | |||
|  |   let promise1 = RSVP.Promise.resolve(1); | |||
|  |   let promise2 = RSVP.Promise.reject(new Error('2')); | |||
|  |   let promise3 = RSVP.Promise.reject(new Error('3')); | |||
|  |   let promises = [ promise1, promise2, promise3 ]; | |||
|  |    RSVP.allSettled(promises).then(function(array){ | |||
|  |     // array == [
 | |||
|  |     //   { state: 'fulfilled', value: 1 },
 | |||
|  |     //   { state: 'rejected', reason: Error },
 | |||
|  |     //   { state: 'rejected', reason: Error }
 | |||
|  |     // ]
 | |||
|  |     // Note that for the second item, reason.message will be '2', and for the
 | |||
|  |     // third item, reason.message will be '3'.
 | |||
|  |   }, function(error) { | |||
|  |     // Not run. (This block would only be called if allSettled had failed,
 | |||
|  |     // for instance if passed an incorrect argument type.)
 | |||
|  |   }); | |||
|  |   ```
 | |||
|  |    @method allSettled | |||
|  |   @public | |||
|  |   @static | |||
|  |   @for rsvp | |||
|  |   @param {Array} entries | |||
|  |   @param {String} [label] - optional string that describes the promise. | |||
|  |   Useful for tooling. | |||
|  |   @return {Promise} promise that is fulfilled with an array of the settled | |||
|  |   states of the constituent promises. | |||
|  |   */ | |||
|  | 
 | |||
|  |   function allSettled(entries, label) { | |||
|  |     if (!Array.isArray(entries)) { | |||
|  |       return Promise.reject(new TypeError("Promise.allSettled must be called with an array"), label); | |||
|  |     } | |||
|  | 
 | |||
|  |     return new AllSettled(Promise, entries, label).promise; | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     This is a convenient alias for `Promise.race`. | |||
|  | 
 | |||
|  |     @method race | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {Array} array Array of promises. | |||
|  |     @param {String} [label] An optional label. This is useful | |||
|  |     for tooling. | |||
|  |    */ | |||
|  |   function race$1(array, label) { | |||
|  |     return Promise.race(array, label); | |||
|  |   } | |||
|  | 
 | |||
|  |   function _possibleConstructorReturn$1(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | |||
|  | 
 | |||
|  |   function _inherits$1(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | |||
|  | 
 | |||
|  |   var PromiseHash = function (_Enumerator) { | |||
|  |     _inherits$1(PromiseHash, _Enumerator); | |||
|  | 
 | |||
|  |     function PromiseHash(Constructor, object) { | |||
|  |       var abortOnReject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; | |||
|  |       var label = arguments[3]; | |||
|  |       return _possibleConstructorReturn$1(this, _Enumerator.call(this, Constructor, object, abortOnReject, label)); | |||
|  |     } | |||
|  | 
 | |||
|  |     PromiseHash.prototype._init = function _init(Constructor, object) { | |||
|  |       this._result = {}; | |||
|  |       this._enumerate(object); | |||
|  |     }; | |||
|  | 
 | |||
|  |     PromiseHash.prototype._enumerate = function _enumerate(input) { | |||
|  |       var keys = Object.keys(input); | |||
|  | 
 | |||
|  |       var length = keys.length; | |||
|  |       var promise = this.promise; | |||
|  |       this._remaining = length; | |||
|  | 
 | |||
|  |       var key = void 0, | |||
|  |           val = void 0; | |||
|  |       for (var i = 0; promise._state === PENDING && i < length; i++) { | |||
|  |         key = keys[i]; | |||
|  |         val = input[key]; | |||
|  |         this._eachEntry(val, key, true); | |||
|  |       } | |||
|  | 
 | |||
|  |       this._checkFullfillment(); | |||
|  |     }; | |||
|  | 
 | |||
|  |     return PromiseHash; | |||
|  |   }(Enumerator); | |||
|  | 
 | |||
|  |   /** | |||
|  |     `hash` is similar to `all`, but takes an object instead of an array | |||
|  |     for its `promises` argument. | |||
|  | 
 | |||
|  |     Returns a promise that is fulfilled when all the given promises have been | |||
|  |     fulfilled, or rejected if any of them become rejected. The returned promise | |||
|  |     is fulfilled with a hash that has the same key names as the `promises` object | |||
|  |     argument. If any of the values in the object are not promises, they will | |||
|  |     simply be copied over to the fulfilled object. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let promises = { | |||
|  |       myPromise: resolve(1), | |||
|  |       yourPromise: resolve(2), | |||
|  |       theirPromise: resolve(3), | |||
|  |       notAPromise: 4 | |||
|  |     }; | |||
|  | 
 | |||
|  |     hash(promises).then(function(hash){ | |||
|  |       // hash here is an object that looks like:
 | |||
|  |       // {
 | |||
|  |       //   myPromise: 1,
 | |||
|  |       //   yourPromise: 2,
 | |||
|  |       //   theirPromise: 3,
 | |||
|  |       //   notAPromise: 4
 | |||
|  |       // }
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     If any of the `promises` given to `hash` are rejected, the first promise | |||
|  |     that is rejected will be given as the reason to the rejection handler. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     let promises = { | |||
|  |       myPromise: resolve(1), | |||
|  |       rejectedPromise: reject(new Error('rejectedPromise')), | |||
|  |       anotherRejectedPromise: reject(new Error('anotherRejectedPromise')), | |||
|  |     }; | |||
|  | 
 | |||
|  |     hash(promises).then(function(hash){ | |||
|  |       // Code here never runs because there are rejected promises!
 | |||
|  |     }, function(reason) { | |||
|  |       // reason.message === 'rejectedPromise'
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     An important note: `hash` is intended for plain JavaScript objects that | |||
|  |     are just a set of keys and values. `hash` will NOT preserve prototype | |||
|  |     chains. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { hash, resolve } from 'rsvp'; | |||
|  |     function MyConstructor(){ | |||
|  |       this.example = resolve('Example'); | |||
|  |     } | |||
|  | 
 | |||
|  |     MyConstructor.prototype = { | |||
|  |       protoProperty: resolve('Proto Property') | |||
|  |     }; | |||
|  | 
 | |||
|  |     let myObject = new MyConstructor(); | |||
|  | 
 | |||
|  |     hash(myObject).then(function(hash){ | |||
|  |       // protoProperty will not be present, instead you will just have an
 | |||
|  |       // object that looks like:
 | |||
|  |       // {
 | |||
|  |       //   example: 'Example'
 | |||
|  |       // }
 | |||
|  |       //
 | |||
|  |       // hash.hasOwnProperty('protoProperty'); // false
 | |||
|  |       // 'undefined' === typeof hash.protoProperty
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method hash | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {Object} object | |||
|  |     @param {String} [label] optional string that describes the promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} promise that is fulfilled when all properties of `promises` | |||
|  |     have been fulfilled, or rejected if any of them become rejected. | |||
|  |   */ | |||
|  |   function hash(object, label) { | |||
|  |     return Promise.resolve(object, label).then(function (object) { | |||
|  |       if (object === null || typeof object !== 'object') { | |||
|  |         throw new TypeError("Promise.hash must be called with an object"); | |||
|  |       } | |||
|  |       return new PromiseHash(Promise, object, label).promise; | |||
|  |     }); | |||
|  |   } | |||
|  | 
 | |||
|  |   function _possibleConstructorReturn$2(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | |||
|  | 
 | |||
|  |   function _inherits$2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | |||
|  | 
 | |||
|  |   var HashSettled = function (_PromiseHash) { | |||
|  |     _inherits$2(HashSettled, _PromiseHash); | |||
|  | 
 | |||
|  |     function HashSettled(Constructor, object, label) { | |||
|  |       return _possibleConstructorReturn$2(this, _PromiseHash.call(this, Constructor, object, false, label)); | |||
|  |     } | |||
|  | 
 | |||
|  |     return HashSettled; | |||
|  |   }(PromiseHash); | |||
|  | 
 | |||
|  |   HashSettled.prototype._setResultAt = setSettledResult; | |||
|  | 
 | |||
|  |   /** | |||
|  |     `hashSettled` is similar to `allSettled`, but takes an object | |||
|  |     instead of an array for its `promises` argument. | |||
|  | 
 | |||
|  |     Unlike `all` or `hash`, which implement a fail-fast method, | |||
|  |     but like `allSettled`, `hashSettled` waits until all the | |||
|  |     constituent promises have returned and then shows you all the results | |||
|  |     with their states and values/reasons. This is useful if you want to | |||
|  |     handle multiple promises' failure states together as a set. | |||
|  | 
 | |||
|  |     Returns a promise that is fulfilled when all the given promises have been | |||
|  |     settled, or rejected if the passed parameters are invalid. | |||
|  | 
 | |||
|  |     The returned promise is fulfilled with a hash that has the same key names as | |||
|  |     the `promises` object argument. If any of the values in the object are not | |||
|  |     promises, they will be copied over to the fulfilled object and marked with state | |||
|  |     'fulfilled'. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { hashSettled, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promises = { | |||
|  |       myPromise: resolve(1), | |||
|  |       yourPromise: resolve(2), | |||
|  |       theirPromise: resolve(3), | |||
|  |       notAPromise: 4 | |||
|  |     }; | |||
|  | 
 | |||
|  |     hashSettled(promises).then(function(hash){ | |||
|  |       // hash here is an object that looks like:
 | |||
|  |       // {
 | |||
|  |       //   myPromise: { state: 'fulfilled', value: 1 },
 | |||
|  |       //   yourPromise: { state: 'fulfilled', value: 2 },
 | |||
|  |       //   theirPromise: { state: 'fulfilled', value: 3 },
 | |||
|  |       //   notAPromise: { state: 'fulfilled', value: 4 }
 | |||
|  |       // }
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     If any of the `promises` given to `hash` are rejected, the state will | |||
|  |     be set to 'rejected' and the reason for rejection provided. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { hashSettled, reject, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promises = { | |||
|  |       myPromise: resolve(1), | |||
|  |       rejectedPromise: reject(new Error('rejection')), | |||
|  |       anotherRejectedPromise: reject(new Error('more rejection')), | |||
|  |     }; | |||
|  | 
 | |||
|  |     hashSettled(promises).then(function(hash){ | |||
|  |       // hash here is an object that looks like:
 | |||
|  |       // {
 | |||
|  |       //   myPromise:              { state: 'fulfilled', value: 1 },
 | |||
|  |       //   rejectedPromise:        { state: 'rejected', reason: Error },
 | |||
|  |       //   anotherRejectedPromise: { state: 'rejected', reason: Error },
 | |||
|  |       // }
 | |||
|  |       // Note that for rejectedPromise, reason.message == 'rejection',
 | |||
|  |       // and for anotherRejectedPromise, reason.message == 'more rejection'.
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     An important note: `hashSettled` is intended for plain JavaScript objects that | |||
|  |     are just a set of keys and values. `hashSettled` will NOT preserve prototype | |||
|  |     chains. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import Promise, { hashSettled, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     function MyConstructor(){ | |||
|  |       this.example = resolve('Example'); | |||
|  |     } | |||
|  | 
 | |||
|  |     MyConstructor.prototype = { | |||
|  |       protoProperty: Promise.resolve('Proto Property') | |||
|  |     }; | |||
|  | 
 | |||
|  |     let myObject = new MyConstructor(); | |||
|  | 
 | |||
|  |     hashSettled(myObject).then(function(hash){ | |||
|  |       // protoProperty will not be present, instead you will just have an
 | |||
|  |       // object that looks like:
 | |||
|  |       // {
 | |||
|  |       //   example: { state: 'fulfilled', value: 'Example' }
 | |||
|  |       // }
 | |||
|  |       //
 | |||
|  |       // hash.hasOwnProperty('protoProperty'); // false
 | |||
|  |       // 'undefined' === typeof hash.protoProperty
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method hashSettled | |||
|  |     @public | |||
|  |     @for rsvp | |||
|  |     @param {Object} object | |||
|  |     @param {String} [label] optional string that describes the promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} promise that is fulfilled when when all properties of `promises` | |||
|  |     have been settled. | |||
|  |     @static | |||
|  |   */ | |||
|  | 
 | |||
|  |   function hashSettled(object, label) { | |||
|  |     return Promise.resolve(object, label).then(function (object) { | |||
|  |       if (object === null || typeof object !== 'object') { | |||
|  |         throw new TypeError("hashSettled must be called with an object"); | |||
|  |       } | |||
|  | 
 | |||
|  |       return new HashSettled(Promise, object, false, label).promise; | |||
|  |     }); | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     `rethrow` will rethrow an error on the next turn of the JavaScript event | |||
|  |     loop in order to aid debugging. | |||
|  | 
 | |||
|  |     Promises A+ specifies that any exceptions that occur with a promise must be | |||
|  |     caught by the promises implementation and bubbled to the last handler. For | |||
|  |     this reason, it is recommended that you always specify a second rejection | |||
|  |     handler function to `then`. However, `rethrow` will throw the exception | |||
|  |     outside of the promise, so it bubbles up to your console if in the browser, | |||
|  |     or domain/cause uncaught exception in Node. `rethrow` will also throw the | |||
|  |     error again so the error can be handled by the promise per the spec. | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { rethrow } from 'rsvp'; | |||
|  | 
 | |||
|  |     function throws(){ | |||
|  |       throw new Error('Whoops!'); | |||
|  |     } | |||
|  | 
 | |||
|  |     let promise = new Promise(function(resolve, reject){ | |||
|  |       throws(); | |||
|  |     }); | |||
|  | 
 | |||
|  |     promise.catch(rethrow).then(function(){ | |||
|  |       // Code here doesn't run because the promise became rejected due to an
 | |||
|  |       // error!
 | |||
|  |     }, function (err){ | |||
|  |       // handle the error here
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     The 'Whoops' error will be thrown on the next turn of the event loop | |||
|  |     and you can watch for it in your console. You can also handle it using a | |||
|  |     rejection handler given to `.then` or `.catch` on the returned promise. | |||
|  | 
 | |||
|  |     @method rethrow | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {Error} reason reason the promise became rejected. | |||
|  |     @throws Error | |||
|  |     @static | |||
|  |   */ | |||
|  |   function rethrow(reason) { | |||
|  |     setTimeout(function () { | |||
|  |       throw reason; | |||
|  |     }); | |||
|  |     throw reason; | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     `defer` returns an object similar to jQuery's `$.Deferred`. | |||
|  |     `defer` should be used when porting over code reliant on `$.Deferred`'s | |||
|  |     interface. New code should use the `Promise` constructor instead. | |||
|  | 
 | |||
|  |     The object returned from `defer` is a plain object with three properties: | |||
|  | 
 | |||
|  |     * promise - an `Promise`. | |||
|  |     * reject - a function that causes the `promise` property on this object to | |||
|  |       become rejected | |||
|  |     * resolve - a function that causes the `promise` property on this object to | |||
|  |       become fulfilled. | |||
|  | 
 | |||
|  |     Example: | |||
|  | 
 | |||
|  |      ```javascript
 | |||
|  |      let deferred = defer(); | |||
|  | 
 | |||
|  |      deferred.resolve("Success!"); | |||
|  | 
 | |||
|  |      deferred.promise.then(function(value){ | |||
|  |        // value here is "Success!"
 | |||
|  |      }); | |||
|  |      ```
 | |||
|  | 
 | |||
|  |     @method defer | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {String} [label] optional string for labeling the promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Object} | |||
|  |    */ | |||
|  | 
 | |||
|  |   function defer(label) { | |||
|  |     var deferred = { resolve: undefined, reject: undefined }; | |||
|  | 
 | |||
|  |     deferred.promise = new Promise(function (resolve, reject) { | |||
|  |       deferred.resolve = resolve; | |||
|  |       deferred.reject = reject; | |||
|  |     }, label); | |||
|  | 
 | |||
|  |     return deferred; | |||
|  |   } | |||
|  | 
 | |||
|  |   function _possibleConstructorReturn$3(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | |||
|  | 
 | |||
|  |   function _inherits$3(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | |||
|  | 
 | |||
|  |   var MapEnumerator = function (_Enumerator) { | |||
|  |     _inherits$3(MapEnumerator, _Enumerator); | |||
|  | 
 | |||
|  |     function MapEnumerator(Constructor, entries, mapFn, label) { | |||
|  |       return _possibleConstructorReturn$3(this, _Enumerator.call(this, Constructor, entries, true, label, mapFn)); | |||
|  |     } | |||
|  | 
 | |||
|  |     MapEnumerator.prototype._init = function _init(Constructor, input, bool, label, mapFn) { | |||
|  |       var len = input.length || 0; | |||
|  |       this.length = len; | |||
|  |       this._remaining = len; | |||
|  |       this._result = new Array(len); | |||
|  |       this._mapFn = mapFn; | |||
|  | 
 | |||
|  |       this._enumerate(input); | |||
|  |     }; | |||
|  | 
 | |||
|  |     MapEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) { | |||
|  |       if (firstPass) { | |||
|  |         var val = tryCatch(this._mapFn)(value, i); | |||
|  |         if (val === TRY_CATCH_ERROR) { | |||
|  |           this._settledAt(REJECTED, i, val.error, false); | |||
|  |         } else { | |||
|  |           this._eachEntry(val, i, false); | |||
|  |         } | |||
|  |       } else { | |||
|  |         this._remaining--; | |||
|  |         this._result[i] = value; | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     return MapEnumerator; | |||
|  |   }(Enumerator); | |||
|  | 
 | |||
|  |   /** | |||
|  |    `map` is similar to JavaScript's native `map` method. `mapFn` is eagerly called | |||
|  |     meaning that as soon as any promise resolves its value will be passed to `mapFn`. | |||
|  |     `map` returns a promise that will become fulfilled with the result of running | |||
|  |     `mapFn` on the values the promises become fulfilled with. | |||
|  | 
 | |||
|  |     For example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { map, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = resolve(1); | |||
|  |     let promise2 = resolve(2); | |||
|  |     let promise3 = resolve(3); | |||
|  |     let promises = [ promise1, promise2, promise3 ]; | |||
|  | 
 | |||
|  |     let mapFn = function(item){ | |||
|  |       return item + 1; | |||
|  |     }; | |||
|  | 
 | |||
|  |     map(promises, mapFn).then(function(result){ | |||
|  |       // result is [ 2, 3, 4 ]
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     If any of the `promises` given to `map` are rejected, the first promise | |||
|  |     that is rejected will be given as an argument to the returned promise's | |||
|  |     rejection handler. For example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { map, reject, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = resolve(1); | |||
|  |     let promise2 = reject(new Error('2')); | |||
|  |     let promise3 = reject(new Error('3')); | |||
|  |     let promises = [ promise1, promise2, promise3 ]; | |||
|  | 
 | |||
|  |     let mapFn = function(item){ | |||
|  |       return item + 1; | |||
|  |     }; | |||
|  | 
 | |||
|  |     map(promises, mapFn).then(function(array){ | |||
|  |       // Code here never runs because there are rejected promises!
 | |||
|  |     }, function(reason) { | |||
|  |       // reason.message === '2'
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     `map` will also wait if a promise is returned from `mapFn`. For example, | |||
|  |     say you want to get all comments from a set of blog posts, but you need | |||
|  |     the blog posts first because they contain a url to those comments. | |||
|  | 
 | |||
|  |     ```javscript
 | |||
|  |     import { map } from 'rsvp'; | |||
|  | 
 | |||
|  |     let mapFn = function(blogPost){ | |||
|  |       // getComments does some ajax and returns an Promise that is fulfilled
 | |||
|  |       // with some comments data
 | |||
|  |       return getComments(blogPost.comments_url); | |||
|  |     }; | |||
|  | 
 | |||
|  |     // getBlogPosts does some ajax and returns an Promise that is fulfilled
 | |||
|  |     // with some blog post data
 | |||
|  |     map(getBlogPosts(), mapFn).then(function(comments){ | |||
|  |       // comments is the result of asking the server for the comments
 | |||
|  |       // of all blog posts returned from getBlogPosts()
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method map | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {Array} promises | |||
|  |     @param {Function} mapFn function to be called on each fulfilled promise. | |||
|  |     @param {String} [label] optional string for labeling the promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} promise that is fulfilled with the result of calling | |||
|  |     `mapFn` on each fulfilled promise or value when they become fulfilled. | |||
|  |      The promise will be rejected if any of the given `promises` become rejected. | |||
|  |   */ | |||
|  |   function map(promises, mapFn, label) { | |||
|  |     if (typeof mapFn !== 'function') { | |||
|  |       return Promise.reject(new TypeError("map expects a function as a second argument"), label); | |||
|  |     } | |||
|  | 
 | |||
|  |     return Promise.resolve(promises, label).then(function (promises) { | |||
|  |       if (!Array.isArray(promises)) { | |||
|  |         throw new TypeError("map must be called with an array"); | |||
|  |       } | |||
|  |       return new MapEnumerator(Promise, promises, mapFn, label).promise; | |||
|  |     }); | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     This is a convenient alias for `Promise.resolve`. | |||
|  | 
 | |||
|  |     @method resolve | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {*} value value that the returned promise will be resolved with | |||
|  |     @param {String} [label] optional string for identifying the returned promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} a promise that will become fulfilled with the given | |||
|  |     `value` | |||
|  |   */ | |||
|  |   function resolve$2(value, label) { | |||
|  |     return Promise.resolve(value, label); | |||
|  |   } | |||
|  | 
 | |||
|  |   /** | |||
|  |     This is a convenient alias for `Promise.reject`. | |||
|  | 
 | |||
|  |     @method reject | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {*} reason value that the returned promise will be rejected with. | |||
|  |     @param {String} [label] optional string for identifying the returned promise. | |||
|  |     Useful for tooling. | |||
|  |     @return {Promise} a promise rejected with the given `reason`. | |||
|  |   */ | |||
|  |   function reject$2(reason, label) { | |||
|  |     return Promise.reject(reason, label); | |||
|  |   } | |||
|  | 
 | |||
|  |   function _possibleConstructorReturn$4(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | |||
|  | 
 | |||
|  |   function _inherits$4(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | |||
|  | 
 | |||
|  |   var EMPTY_OBJECT = {}; | |||
|  | 
 | |||
|  |   var FilterEnumerator = function (_MapEnumerator) { | |||
|  |     _inherits$4(FilterEnumerator, _MapEnumerator); | |||
|  | 
 | |||
|  |     function FilterEnumerator() { | |||
|  |       return _possibleConstructorReturn$4(this, _MapEnumerator.apply(this, arguments)); | |||
|  |     } | |||
|  | 
 | |||
|  |     FilterEnumerator.prototype._checkFullfillment = function _checkFullfillment() { | |||
|  |       if (this._remaining === 0 && this._result !== null) { | |||
|  |         var result = this._result.filter(function (val) { | |||
|  |           return val !== EMPTY_OBJECT; | |||
|  |         }); | |||
|  |         fulfill(this.promise, result); | |||
|  |         this._result = null; | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     FilterEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) { | |||
|  |       if (firstPass) { | |||
|  |         this._result[i] = value; | |||
|  |         var val = tryCatch(this._mapFn)(value, i); | |||
|  |         if (val === TRY_CATCH_ERROR) { | |||
|  |           this._settledAt(REJECTED, i, val.error, false); | |||
|  |         } else { | |||
|  |           this._eachEntry(val, i, false); | |||
|  |         } | |||
|  |       } else { | |||
|  |         this._remaining--; | |||
|  |         if (!value) { | |||
|  |           this._result[i] = EMPTY_OBJECT; | |||
|  |         } | |||
|  |       } | |||
|  |     }; | |||
|  | 
 | |||
|  |     return FilterEnumerator; | |||
|  |   }(MapEnumerator); | |||
|  | 
 | |||
|  |   /** | |||
|  |    `filter` is similar to JavaScript's native `filter` method. | |||
|  |    `filterFn` is eagerly called meaning that as soon as any promise | |||
|  |     resolves its value will be passed to `filterFn`. `filter` returns | |||
|  |     a promise that will become fulfilled with the result of running | |||
|  |     `filterFn` on the values the promises become fulfilled with. | |||
|  | 
 | |||
|  |     For example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { filter, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = resolve(1); | |||
|  |     let promise2 = resolve(2); | |||
|  |     let promise3 = resolve(3); | |||
|  | 
 | |||
|  |     let promises = [promise1, promise2, promise3]; | |||
|  | 
 | |||
|  |     let filterFn = function(item){ | |||
|  |       return item > 1; | |||
|  |     }; | |||
|  | 
 | |||
|  |     filter(promises, filterFn).then(function(result){ | |||
|  |       // result is [ 2, 3 ]
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     If any of the `promises` given to `filter` are rejected, the first promise | |||
|  |     that is rejected will be given as an argument to the returned promise's | |||
|  |     rejection handler. For example: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { filter, reject, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let promise1 = resolve(1); | |||
|  |     let promise2 = reject(new Error('2')); | |||
|  |     let promise3 = reject(new Error('3')); | |||
|  |     let promises = [ promise1, promise2, promise3 ]; | |||
|  | 
 | |||
|  |     let filterFn = function(item){ | |||
|  |       return item > 1; | |||
|  |     }; | |||
|  | 
 | |||
|  |     filter(promises, filterFn).then(function(array){ | |||
|  |       // Code here never runs because there are rejected promises!
 | |||
|  |     }, function(reason) { | |||
|  |       // reason.message === '2'
 | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     `filter` will also wait for any promises returned from `filterFn`. | |||
|  |     For instance, you may want to fetch a list of users then return a subset | |||
|  |     of those users based on some asynchronous operation: | |||
|  | 
 | |||
|  |     ```javascript
 | |||
|  |     import { filter, resolve } from 'rsvp'; | |||
|  | 
 | |||
|  |     let alice = { name: 'alice' }; | |||
|  |     let bob   = { name: 'bob' }; | |||
|  |     let users = [ alice, bob ]; | |||
|  | 
 | |||
|  |     let promises = users.map(function(user){ | |||
|  |       return resolve(user); | |||
|  |     }); | |||
|  | 
 | |||
|  |     let filterFn = function(user){ | |||
|  |       // Here, Alice has permissions to create a blog post, but Bob does not.
 | |||
|  |       return getPrivilegesForUser(user).then(function(privs){ | |||
|  |         return privs.can_create_blog_post === true; | |||
|  |       }); | |||
|  |     }; | |||
|  |     filter(promises, filterFn).then(function(users){ | |||
|  |       // true, because the server told us only Alice can create a blog post.
 | |||
|  |       users.length === 1; | |||
|  |       // false, because Alice is the only user present in `users`
 | |||
|  |       users[0] === bob; | |||
|  |     }); | |||
|  |     ```
 | |||
|  | 
 | |||
|  |     @method filter | |||
|  |     @public | |||
|  |     @static | |||
|  |     @for rsvp | |||
|  |     @param {Array} promises | |||
|  |     @param {Function} filterFn - function to be called on each resolved value to | |||
|  |     filter the final results. | |||
|  |     @param {String} [label] optional string describing the promise. Useful for | |||
|  |     tooling. | |||
|  |     @return {Promise} | |||
|  |   */ | |||
|  | 
 | |||
|  |   function filter(promises, filterFn, label) { | |||
|  |     if (typeof filterFn !== 'function') { | |||
|  |       return Promise.reject(new TypeError("filter expects function as a second argument"), label); | |||
|  |     } | |||
|  | 
 | |||
|  |     return Promise.resolve(promises, label).then(function (promises) { | |||
|  |       if (!Array.isArray(promises)) { | |||
|  |         throw new TypeError("filter must be called with an array"); | |||
|  |       } | |||
|  |       return new FilterEnumerator(Promise, promises, filterFn, label).promise; | |||
|  |     }); | |||
|  |   } | |||
|  | 
 | |||
|  |   var len = 0; | |||
|  |   var vertxNext = void 0; | |||
|  |   function asap(callback, arg) { | |||
|  |     queue$1[len] = callback; | |||
|  |     queue$1[len + 1] = arg; | |||
|  |     len += 2; | |||
|  |     if (len === 2) { | |||
|  |       // If len is 1, that means that we need to schedule an async flush.
 | |||
|  |       // If additional callbacks are queued before the queue is flushed, they
 | |||
|  |       // will be processed by this flush that we are scheduling.
 | |||
|  |       scheduleFlush$1(); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   var browserWindow = typeof window !== 'undefined' ? window : undefined; | |||
|  |   var browserGlobal = browserWindow || {}; | |||
|  |   var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; | |||
|  |   var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; | |||
|  | 
 | |||
|  |   // test for web worker but not in IE10
 | |||
|  |   var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; | |||
|  | 
 | |||
|  |   // node
 | |||
|  |   function useNextTick() { | |||
|  |     var nextTick = process.nextTick; | |||
|  |     // node version 0.10.x displays a deprecation warning when nextTick is used recursively
 | |||
|  |     // setImmediate should be used instead instead
 | |||
|  |     var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/); | |||
|  |     if (Array.isArray(version) && version[1] === '0' && version[2] === '10') { | |||
|  |       nextTick = setImmediate; | |||
|  |     } | |||
|  |     return function () { | |||
|  |       return nextTick(flush); | |||
|  |     }; | |||
|  |   } | |||
|  | 
 | |||
|  |   // vertx
 | |||
|  |   function useVertxTimer() { | |||
|  |     if (typeof vertxNext !== 'undefined') { | |||
|  |       return function () { | |||
|  |         vertxNext(flush); | |||
|  |       }; | |||
|  |     } | |||
|  |     return useSetTimeout(); | |||
|  |   } | |||
|  | 
 | |||
|  |   function useMutationObserver() { | |||
|  |     var iterations = 0; | |||
|  |     var observer = new BrowserMutationObserver(flush); | |||
|  |     var node = document.createTextNode(''); | |||
|  |     observer.observe(node, { characterData: true }); | |||
|  | 
 | |||
|  |     return function () { | |||
|  |       return node.data = iterations = ++iterations % 2; | |||
|  |     }; | |||
|  |   } | |||
|  | 
 | |||
|  |   // web worker
 | |||
|  |   function useMessageChannel() { | |||
|  |     var channel = new MessageChannel(); | |||
|  |     channel.port1.onmessage = flush; | |||
|  |     return function () { | |||
|  |       return channel.port2.postMessage(0); | |||
|  |     }; | |||
|  |   } | |||
|  | 
 | |||
|  |   function useSetTimeout() { | |||
|  |     return function () { | |||
|  |       return setTimeout(flush, 1); | |||
|  |     }; | |||
|  |   } | |||
|  | 
 | |||
|  |   var queue$1 = new Array(1000); | |||
|  | 
 | |||
|  |   function flush() { | |||
|  |     for (var i = 0; i < len; i += 2) { | |||
|  |       var callback = queue$1[i]; | |||
|  |       var arg = queue$1[i + 1]; | |||
|  | 
 | |||
|  |       callback(arg); | |||
|  | 
 | |||
|  |       queue$1[i] = undefined; | |||
|  |       queue$1[i + 1] = undefined; | |||
|  |     } | |||
|  | 
 | |||
|  |     len = 0; | |||
|  |   } | |||
|  | 
 | |||
|  |   function attemptVertex() { | |||
|  |     try { | |||
|  |       var vertx = Function('return this')().require('vertx'); | |||
|  |       vertxNext = vertx.runOnLoop || vertx.runOnContext; | |||
|  |       return useVertxTimer(); | |||
|  |     } catch (e) { | |||
|  |       return useSetTimeout(); | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   var scheduleFlush$1 = void 0; | |||
|  |   // Decide what async method to use to triggering processing of queued callbacks:
 | |||
|  |   if (isNode) { | |||
|  |     scheduleFlush$1 = useNextTick(); | |||
|  |   } else if (BrowserMutationObserver) { | |||
|  |     scheduleFlush$1 = useMutationObserver(); | |||
|  |   } else if (isWorker) { | |||
|  |     scheduleFlush$1 = useMessageChannel(); | |||
|  |   } else if (browserWindow === undefined && typeof require === 'function') { | |||
|  |     scheduleFlush$1 = attemptVertex(); | |||
|  |   } else { | |||
|  |     scheduleFlush$1 = useSetTimeout(); | |||
|  |   } | |||
|  | 
 | |||
|  |   // defaults
 | |||
|  |   config.async = asap; | |||
|  |   config.after = function (cb) { | |||
|  |     return setTimeout(cb, 0); | |||
|  |   }; | |||
|  |   var cast = resolve$2; | |||
|  | 
 | |||
|  |   var async = function (callback, arg) { | |||
|  |     return config.async(callback, arg); | |||
|  |   }; | |||
|  | 
 | |||
|  |   function on() { | |||
|  |     config.on.apply(config, arguments); | |||
|  |   } | |||
|  | 
 | |||
|  |   function off() { | |||
|  |     config.off.apply(config, arguments); | |||
|  |   } | |||
|  | 
 | |||
|  |   // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`
 | |||
|  |   if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') { | |||
|  |     var callbacks = window['__PROMISE_INSTRUMENTATION__']; | |||
|  |     configure('instrument', true); | |||
|  |     for (var eventName in callbacks) { | |||
|  |       if (callbacks.hasOwnProperty(eventName)) { | |||
|  |         on(eventName, callbacks[eventName]); | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   // the default export here is for backwards compat:
 | |||
|  |   //   https://github.com/tildeio/rsvp.js/issues/434
 | |||
|  |   var rsvp = { | |||
|  |     asap: asap, | |||
|  |     cast: cast, | |||
|  |     Promise: Promise, | |||
|  |     EventTarget: EventTarget, | |||
|  |     all: all$1, | |||
|  |     allSettled: allSettled, | |||
|  |     race: race$1, | |||
|  |     hash: hash, | |||
|  |     hashSettled: hashSettled, | |||
|  |     rethrow: rethrow, | |||
|  |     defer: defer, | |||
|  |     denodeify: denodeify, | |||
|  |     configure: configure, | |||
|  |     on: on, | |||
|  |     off: off, | |||
|  |     resolve: resolve$2, | |||
|  |     reject: reject$2, | |||
|  |     map: map, | |||
|  |     async: async, | |||
|  |     filter: filter | |||
|  |   }; | |||
|  | 
 | |||
|  |   exports.default = rsvp; | |||
|  |   exports.asap = asap; | |||
|  |   exports.cast = cast; | |||
|  |   exports.Promise = Promise; | |||
|  |   exports.EventTarget = EventTarget; | |||
|  |   exports.all = all$1; | |||
|  |   exports.allSettled = allSettled; | |||
|  |   exports.race = race$1; | |||
|  |   exports.hash = hash; | |||
|  |   exports.hashSettled = hashSettled; | |||
|  |   exports.rethrow = rethrow; | |||
|  |   exports.defer = defer; | |||
|  |   exports.denodeify = denodeify; | |||
|  |   exports.configure = configure; | |||
|  |   exports.on = on; | |||
|  |   exports.off = off; | |||
|  |   exports.resolve = resolve$2; | |||
|  |   exports.reject = reject$2; | |||
|  |   exports.map = map; | |||
|  |   exports.async = async; | |||
|  |   exports.filter = filter; | |||
|  | 
 | |||
|  |   Object.defineProperty(exports, '__esModule', { value: true }); | |||
|  | 
 | |||
|  | }))); | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | //# sourceMappingURL=rsvp.map
 |