promise-zy
Version:
A simple implementation of Promies/A+
1 lines • 5.47 kB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Promise=t():e.Promise=t()}("undefined"!=typeof self?self:this,function(){return function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}return o.m=n,o.c=r,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,n){"use strict";var r=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};var c=!1;function f(e){if("function"==typeof e||"object"==(void 0===e?"undefined":o(e))&&null!=e)try{var t=e.then;if(t&&"function"==typeof t)return{throwed:!1,then:t}}catch(e){return{throwed:!0,then:e}}return{throwed:!1,then:null}}var u=function(){function u(e){var t=this;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u),"function"!=typeof e)throw new Error("need 1 argument and it should be a function");this._decideLock="locked";var r=!(this._retrivers=[]),n=!1,o="pending",i=void 0;Object.defineProperties(this,{_PromiseStatus:{get:function(){return o},set:function(e){var t,n=this;if("locked"==this._decideLock)return!1;if(r)return!1;if("pending"==o&&"pending"!=e){if(r=!0,o=e,0==this._retrivers.length&&"rejected"==this._PromiseStatus&&!c)throw t=this._PromiseValue,new Error("Uncaught (in promise) "+t);setTimeout(function(){n._onStatusChange(e)})}}},_PromiseValue:{get:function(){return i},set:function(e){return"locked"!=this._decideLock&&(!n&&(n=!0,void(i=e)))}}});try{e(function(e){t._decide("fufilled",e)},function(e){t._decide("rejected",e)})}catch(e){setTimeout(function(){t._decide("rejected",e)})}}return r(u,[{key:"_decide",value:function(e,t){this._decideLock="unlock",this._PromiseValue=t,this._PromiseStatus=e,this._decideLock="locked"}},{key:"_onStatusChange",value:function(e){for(;0<this._retrivers.length;){var t=this._retrivers.shift();try{var n=void 0;if("fufilled"==e)n=t.onFufilled?t.onFufilled.call(void 0,this._PromiseValue):this._PromiseValue;else if("rejected"==e){if(!t.onRejected){if(this._PromiseValue instanceof Error)throw this._PromiseValue;this._reject(t.promise2,this._PromiseValue);continue}n=t.onRejected.call(void 0,this._PromiseValue)}this._resolve(t.promise2,n)}catch(e){this._reject(t.promise2,e)}}}},{key:"_resolve",value:function(o,e){var t=this,n=f(e),r=n.throwed,i=n.then;if(r)throw i;if(o==e&&this._reject(o,new TypeError("as [[Resolve]](promise, x) defined, promise === x is wrong")),e instanceof u)"pending"==e._PromiseStatus?e.then(function(e){var t=f(e),n=t.throwed,r=t.then;if(n)o._decide("rejected",r);else if(r)try{r.call(e,function(e){o._decide("fufilled",e)},function(e){o._decide("rejected",e)})}catch(e){o._decide("rejected",e)}else o._decide("fufilled",e)},function(e){o._decide("rejected",e)}):"fufilled"==e._PromiseStatus?this._resolve(o,e._PromiseValue):"rejected"==e._PromiseStatus&&(e._PromiseValue instanceof u?this._resolve(o,e._PromiseValue):o._decide("rejected",e._PromiseValue));else if(i){var c=!1;try{i.call(e,function(e){if(!c){c=!0;try{t._resolve(o,e)}catch(e){t._reject(o,e)}}},function(e){c||(c=!0,t._reject(o,e))})}catch(e){c||this._reject(o,e)}}else o._decide("fufilled",e)}},{key:"_reject",value:function(e,t){e._decide("rejected",t)}},{key:"then",value:function(e,t){var n=this;"function"!=typeof e&&(e=null),"function"!=typeof t&&(t=null);var r=new u(function(){});return this._retrivers.push({onFufilled:e,onRejected:t,promise2:r}),setTimeout(function(){"pending"!=n._PromiseStatus&&n._onStatusChange(n._PromiseStatus)}),r}},{key:"catch",value:function(e){return this.then(null,e)}}]),u}();u.all=function(){var c=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[];if(!c)throw new Error("no argument");if(!(c instanceof Array||c instanceof Map||c instanceof Set))throw new TypeError("arg type wrong");return new u(function(n,r){var o=[],i=!1;0==c.length&&n(c),c.forEach(function(e,t){u.resolve(e).then(function(e){i||(o.push({index:t,value:e}),o.length==c.length&&n(o.sort(function(e,t){return e.index>t.index}).reduce(function(e,t){return e.push(t.value),e},[])))},function(e){i||(i=!0,r(e))})})})},u.race=function(e){if(!e)throw new Error("no argument");if(!(e instanceof Array||e instanceof Map||e instanceof Set))throw new TypeError("arg type wrong");return new u(function(n,r){var o=void 0;0==e.length&&n(e),e.forEach(function(e,t){u.resolve(e).then(function(e){o||n(o=e)},function(e){o||r(o=e)})})})},u.resolve=function(r){var e=f(r),t=e.throwed,o=e.then;return t?new u(function(e,t){t(o)}):r instanceof u?r:new u(o?function(t,n){try{o.call(r,function(e){t(e)},function(e){n(e)})}catch(e){n(e)}}:function(e,t){e(r)})},u.reject=function(n){return new u(function(e,t){t(n)})},u.dontThrow=function(){c=!0},e.exports=u}])});