-
Notifications
You must be signed in to change notification settings - Fork 1
/
IPromise.min.js
1 lines (1 loc) · 1.89 KB
/
IPromise.min.js
1
function IPromise(){"use strict";var a=function a(b,c,d){function k(a,b){return g!==e?j:(a?g=b:(f.data=b,g=f),m(a?h:i,void 0))}function l(a,b){a&&(g.isBreaker&&"breaker"===g.isBreaker()?(g.push(j),m.lastValue=a[0].apply(a[1]||b,g),g.pop()):m.lastValue=a[0].call(a[1]||b,g,j),g=void 0!==m.lastValue?m.lastValue:g)}function m(b,d){function e(){arguments.length&&(g=a.argsArray(Array.prototype.slice.call(arguments,0,arguments.length-1))),setTimeout(function(){if(l(b[m.index++],d),m.index<b.length){if(m.lastValue&&"Promise"===m.lastValue.type)return m.lastValue.always(e);e()}else m.index=-1,h.length=0,i.length=0},0)}return-1===m.index&&b.length&&(d=c||j,m.index++,e()),j}if(!d&&a.instances[b])return a.instances[b];var j,e={status:"pendeing"},f={status:"rejected"},g=e,h=[],i=[];return m.index=-1,m.lastValue=void 0,j={constructor:a,type:"Promise",id:b?""+b:"anonymous",status:function(){return g===e?"pendeing":g===f?"rejected":"resolved"},then:function(a,b,c){return a&&h.push([a,c]),b&&i.push([b,c]),"pendeing"===j.status()?j:m("rejected"===j.status()?i:h,void 0)},fail:function(a,b){return j.then(null,a,b)},done:function(a,b){return j.then(a,null,b)},always:function(a,b){return j.then(a,a,b)},timeout:function(a,b){return setTimeout(j.reject.$with(b),a),j}},j.resolve=k.bind(j,!0),j.reject=k.bind(j,!1),j.resolve.$with=function(a){return j.resolve.bind(null,a)},j.reject.$with=function(a){return j.reject.bind(null,a)},a.store(b,j)};return a.instances={},a.store=function(b,c){return void 0!==b&&null!==b&&(a.instances[b]=c),c},a.when=function(b,c,d){c=c||[];var g,e=a.argsArray(),f=!1,h=a(b,d);if(!c.length)return h.resolve(e);var i=function(a,b){return"rejected"===a.status()&&(f=!0),e.push(b),c.length===e.length?f?h.reject(e):h.resolve(e):void 0};for(g=0;c.length>g;g++)c[g].always(i.bind(null,c[g]),d);return h},a.argsArray=function(a){var b=a||[];return b.isBreaker=function(){return"breaker"},b},a.name||(a.name="Promise"),a}