/** * @module vow * @author Filatov Dmitry * @version 0.4.3 * @license * Dual licensed under the MIT and GPL licenses: * * http://www.opensource.org/licenses/mit-license.php * * http://www.gnu.org/licenses/gpl.html */(function(e){var t=function(){this._promise=new r};t.prototype={promise:function(){return this._promise},resolve:function(e){this._promise.isResolved()||this._promise._resolve(e)},reject:function(e){this._promise.isResolved()||this._promise._reject(e)},notify:function(e){this._promise.isResolved()||this._promise._notify(e)}};var n={PENDING:0,FULFILLED:1,REJECTED:-1},r=function(e){this._value=u,this._status=n.PENDING,this._fulfilledCallbacks=[],this._rejectedCallbacks=[],this._progressCallbacks=[];if(e){var t=this,r=e.length;e(function(e){t.isResolved()||t._resolve(e)},r>1?function(e){t.isResolved()||t._reject(e)}:u,r>2?function(e){t.isResolved()||t._notify(e)}:u)}};r.prototype={valueOf:function(){return this._value},isResolved:function(){return this._status!==n.PENDING},isFulfilled:function(){return this._status===n.FULFILLED},isRejected:function(){return this._status===n.REJECTED},then:function(e,n,r,i){var s=new t;return this._addCallbacks(s,e,n,r,i),s.promise()},"catch":function(e,t){return this.then(u,e,t)},fail:function(e,t){return this.then(u,e,t)},always:function(e,t){var n=this,r=function(){return e.call(this,n)};return this.then(r,r,t)},progress:function(e,t){return this.then(u,u,e,t)},spread:function(e,t,n){return this.then(function(t){return e.apply(this,t)},t,n)},done:function(e,t,n,r){this.then(e,t,n,r).fail(f)},delay:function(e){var n,r=this.then(function(r){var i=new t;return n=setTimeout(function(){i.resolve(r)},e),i.promise()});return r.always(function(){clearTimeout(n)}),r},timeout:function(e){var n=new t,r=setTimeout(function(){n.reject(Error("timed out"))},e);return this.then(function(e){n.resolve(e)},function(e){n.reject(e)}),n.promise().always(function(){clearTimeout(r)}),n.promise()},_vow:!0,_resolve:function(e){if(this._status!==n.PENDING)return;if(e===this){this._reject(TypeError("Can't resolve promise with itself"));return}if(e&&!!e._vow){e.then(this._resolve,this._reject,this._notify,this);return}if(c(e)||l(e)){var t;try{t=e.then}catch(r){this._reject(r);return}if(l(t)){var i=this,s=!1;try{t.call(e,function(e){if(s)return;s=!0,i._resolve(e)},function(e){if(s)return;s=!0,i._reject(e)},function(e){i._notify(e)})}catch(r){s||this._reject(r)}return}}this._fulfill(e)},_fulfill:function(e){if(this._status!==n.PENDING)return;this._status=n.FULFILLED,this._value=e,this._callCallbacks(this._fulfilledCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=u},_reject:function(e){if(this._status!==n.PENDING)return;this._status=n.REJECTED,this._value=e,this._callCallbacks(this._rejectedCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=u},_notify:function(e){this._callCallbacks(this._progressCallbacks,e)},_addCallbacks:function(e,t,r,i,s){r&&!l(r)?(s=r,r=u):i&&!l(i)&&(s=i,i=u);var o;this.isRejected()||(o={defer:e,fn:l(t)?t:u,ctx:s},this.isFulfilled()?this._callCallbacks([o],this._value):this._fulfilledCallbacks.push(o)),this.isFulfilled()||(o={defer:e,fn:r,ctx:s},this.isRejected()?this._callCallbacks([o],this._value):this._rejectedCallbacks.push(o)),this._status===n.PENDING&&this._progressCallbacks.push({defer:e,fn:i,ctx:s})},_callCallbacks:function(e,t){var n=e.length;if(!n)return;var r=this.isResolved(),i=this.isFulfilled();a(function(){var s=0,o,u,a;while(s