vow.min.js 7.8 KB

123456789
  1. /**
  2. * @module vow
  3. * @author Filatov Dmitry <dfilatov@yandex-team.ru>
  4. * @version 0.4.3
  5. * @license
  6. * Dual licensed under the MIT and GPL licenses:
  7. * * http://www.opensource.org/licenses/mit-license.php
  8. * * http://www.gnu.org/licenses/gpl.html
  9. */(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<n){o=e[s++],u=o.defer,a=o.fn;if(a){var f=o.ctx,l;try{l=f?a.call(f,t):a(t)}catch(c){u.reject(c);continue}r?u.resolve(l):u.notify(l)}else r?i?u.resolve(t):u.reject(t):u.notify(t)}})}};var i={cast:function(e){return o.cast(e)},all:function(e){return o.all(e)},race:function(e){return o.anyResolved(e)},resolve:function(e){return o.resolve(e)},reject:function(e){return o.reject(e)}};for(var s in i)i.hasOwnProperty(s)&&(r[s]=i[s]);var o={Deferred:t,Promise:r,defer:function(){return new t},when:function(e,t,n,r,i){return o.cast(e).then(t,n,r,i)},fail:function(e,t,n){return o.when(e,u,t,n)},always:function(e,t,n){return o.when(e).always(t,n)},progress:function(e,t,n){return o.when(e).progress(t,n)},spread:function(e,t,n,r){return o.when(e).spread(t,n,r)},done:function(e,t,n,r,i){o.when(e).done(t,n,r,i)},isPromise:function(e){return c(e)&&l(e.then)},cast:function(e){return o.isPromise(e)?e:o.resolve(e)},valueOf:function(e){return e&&l(e.valueOf)?e.valueOf():e},isFulfilled:function(e){return e&&l(e.isFulfilled)?e.isFulfilled():!0},isRejected:function(e){return e&&l(e.isRejected)?e.isRejected():!1},isResolved:function(e){return e&&l(e.isResolved)?e.isResolved():!0},resolve:function(e){var t=o.defer();return t.resolve(e),t.promise()},fulfill:function(e){return o.when(e,null,function(e){return e})},reject:function(e){return o.when(e,function(e){throw e})},invoke:function(t,n){var r=Math.max(arguments.length-1,0),i;if(r){i=Array(r);var s=0;while(s<r)i[s++]=arguments[s]}try{return o.resolve(i?t.apply(e,i):t.call(e))}catch(u){return o.reject(u)}},all:function(e){var n=new t,r=p(e),i=r?d(e):v(e),s=i.length,u=r?[]:{};if(!s)return n.resolve(u),n.promise();var a=s;return o._forEach(e,function(){if(!--a){var t=0;while(t<s)u[i[t]]=o.valueOf(e[i[t++]]);n.resolve(u)}},n.reject,n.notify,n,i),n.promise()},allResolved:function(e){var n=new t,r=p(e),i=r?d(e):v(e),s=i.length,u=r?[]:{};if(!s)return n.resolve(u),n.promise();var a=function(){--s||n.resolve(e)};return o._forEach(e,a,a,n.notify,n,i),n.promise()},allPatiently:function(e){return o.allResolved(e).then(function(){var t=p(e),n=t?d(e):v(e),r,i,s=n.length,u=0,a,f;if(!s)return t?[]:{};while(u<s)a=n[u++],f=e[a],o.isRejected(f)?(r||(r=t?[]:{}),t?r.push(f.valueOf()):r[a]=f.valueOf()):r||((i||(i=t?[]:{}))[a]=o.valueOf(f));if(r)throw r;return i})},any:function(e){var n=new t,r=e.length;if(!r)return n.reject(Error()),n.promise();var i=0,s;return o._forEach(e,n.resolve,function(e){i||(s=e),++i===r&&n.reject(s)},n.notify,n),n.promise()},anyResolved:function(e){var n=new t,r=e.length;return r?(o._forEach(e,n.resolve,n.reject,n.notify,n),n.promise()):(n.reject(Error()),n.promise())},delay:function(e,t){return o.resolve(e).delay(t)},timeout:function(e,t){return o.resolve(e).timeout(t)},_forEach:function(e,t,n,r,i,s){var u=s?s.length:e.length,a=0;while(a<u)o.when(e[s?s[a]:a],t,n,r,i),++a}},u,a=function(){var t=[],n=function(e){return t.push(e)===1},r=function(){var e=t,n=0,r=t.length;t=[];while(n<r)e[n++]()};if(typeof setImmediate=="function")return function(e){n(e)&&setImmediate(r)};if(typeof process=="object"&&process.nextTick)return function(e){n(e)&&process.nextTick(r)};if(e.postMessage){var i=!0;if(e.attachEvent){var s=function(){i=!1};e.attachEvent("onmessage",s),e.postMessage("__checkAsync","*"),e.detachEvent("onmessage",s)}if(i){var o="__promise"+ +(new Date),u=function(e){e.data===o&&(e.stopPropagation&&e.stopPropagation(),r())};return e.addEventListener?e.addEventListener("message",u,!0):e.attachEvent("onmessage",u),function(t){n(t)&&e.postMessage(o,"*")}}}var a=e.document;if("onreadystatechange"in a.createElement("script")){var f=function(){var e=a.createElement("script");e.onreadystatechange=function(){e.parentNode.removeChild(e),e=e.onreadystatechange=null,r()},(a.documentElement||a.body).appendChild(e)};return function(e){n(e)&&f()}}return function(e){n(e)&&setTimeout(r,0)}}(),f=function(e){a(function(){throw e})},l=function(e){return typeof e=="function"},c=function(e){return e!==null&&typeof e=="object"},h=Object.prototype.toString,p=Array.isArray||function(e){return h.call(e)==="[object Array]"},d=function(e){var t=[],n=0,r=e.length;while(n<r)t.push(n++);return t},v=Object.keys||function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},m=!0;typeof exports=="object"&&(module.exports=o,m=!1),typeof modules=="object"&&(modules.define("vow",function(e){e(o)}),m=!1),typeof define=="function"&&(define(function(e,t,n){n.exports=o}),m=!1),m&&(e.vow=o)})(this);