enhanced-promises
Version:
add Q functionality to native JS promises (and polyfill Promises for old versions of JS)
1 lines • 4.8 kB
JavaScript
!function(e){function t(e){e&&(this.promise=e)}if(!e.Promise){t.prototype.resolved=!1,t.prototype.rejected=!1,t.prototype.resolvedValue=void 0,t.prototype.rejectedValue=void 0,t.prototype.resolve=function(e){this.resolved||this.rejected||(this.resolved=!0,this.resolvedValue=e),this.promise&&this.promise.tick()},t.prototype.reject=function(e){this.resolved||this.rejected||(this.rejected=!0,this.rejectedValue=e),this.promise&&this.promise.tick()};var r=e.Promise=function(e){if(e){var r=this.deferred=new t(this);try{e(r.resolve.bind(r),r.reject.bind(r))}catch(o){r.reject(o)}}};r.prototype.thenMethod=void 0,r.prototype.thenMethodEvaluated=!1,r.prototype.catchMethodEvaluated=!1,r.prototype.thenMethodResult=void 0,r.prototype.nextPromise=void 0,r.prototype.transferred=!1,r.defer=function(){var e=new r;return e.deferred=new t(e),e.deferred},r.toPromise=function(e){return e instanceof r?e:e instanceof Error?r.reject(e):r.resolve(e)},r.resolve=function(e){var o=new r,n=o.deferred=new t(o);return n.resolved=!0,n.resolvedValue=e,o},r.reject=function(e){var o=new r,n=o.deferred=new t(o);return n.rejected=!0,n.rejectedValue=e,o},r.all=function(e){var t=[],o=0,n=r.defer();return e.forEach(function(i,s){r.toPromise(i).then(function(r){t[s]=r,o++,o==e.length&&n.resolve(t)})["catch"](function(e){n.reject(e)})}),n.promise},r.race=function(e){var t=!1,o=r.defer();return e.forEach(function(e,n){r.toPromise(e).then(function(e){t||(t=!0,o.resolve(e))})["catch"](function(e){t||(t=!0,o.reject(e))})}),o.promise},r.prototype.tick=function(){if(this.deferred){if(this.deferred.resolved){if(!this.thenMethodEvaluated&&this.thenMethod)try{var e=this.thenMethod(this.deferred.resolvedValue);this.thenMethodResult=r.toPromise(e),this.thenMethodEvaluated=!0}catch(o){var n=this.deferred=new t(this);n.rejected=!0,n.rejectedValue=o}this.thenMethodEvaluated&&this.nextPromise&&(this.nextPromise.deferred=this.thenMethodResult.deferred,this.nextPromise.deferred.promise=this.nextPromise,this.nextPromise.tick())}this.deferred.rejected&&(this.catchMethod?this.catchMethodEvaluated||(this.catchMethod(this.deferred.rejectedValue),this.catchMethodEvaluated=!0):this.nextPromise&&this.nextPromise.reject(this.deferred.rejectedValue))}},r.prototype.resolve=function(e){if(!this.deferred)throw new Error("missing deferred");this.deferred.resolve(e)},r.prototype.reject=function(e){this.deferred||(this.deferred=new t(this)),this.deferred.reject(e)},r.prototype["catch"]=function(e){if(this.catchMethod)throw new Error("already have a catch method");return this.catchMethod=e,setTimeout(this.tick.bind(this),0),this},r.prototype.then=function(e,t){if(this.thenMethod)throw new Error("already have a then method");return this.thenMethod=e,this.nextPromise||(this.nextPromise=new r),t?this["catch"](t):(setTimeout(this.tick.bind(this),0),this.nextPromise)}}e.Promise.npost=function(t,r,o){return new e.Promise(function(e,n){o.push(function(t){if(t)n(t);else{var r=arguments[1];if(arguments.length>2){r=[];for(var o=1;o<arguments.length;o++)r.push(arguments[o])}e(r)}}),("string"==typeof r?t[r]:r).apply(t,o)})},e.Promise.ninvoke=function(t,r){var o=[].slice.call(arguments,2);return e.Promise.npost(t,r,o)},e.Promise.nbind=function(t,r){return function(){var o=[].slice.call(arguments);return e.Promise.npost(t,r,o)}},e.Promise.denodify=function(t){return function(){var r=[].slice.call(arguments);return e.Promise.npost(null,t,r)}},e.Promise.nfapply=function(t,r){return e.Promise.npost(null,t,r)},e.Promise.nfcall=function(t){var r=[].slice.call(arguments,1);return e.Promise.npost(null,t,r)},e.Promise.prototype.spread=function(e){return this.then(function(t){return t.constructor===Array?e.apply(this,t):e(t)})},e.Promise.delay=function(t){return new e.Promise(function(e,r){setTimeout(e,t||0)})},e.Promise.fcall=function(t){var r;try{r=t()}catch(o){r=o}return r instanceof e.Promise?r:r instanceof Error?e.Promise.reject(r):e.Promise.resolve(r)},e.Promise.prototype.all=function(){return this.then(function(t){return!t.constructor===Array&&(t=[t]),e.Promise.all(t)})},e.Promise.defer||(e.Promise.defer=function(){var t={};return t.promise=new e.Promise(function(e,r){t.resolve=function(t){e(t)},t.reject=function(e){r(e)}}),t});var o=e.Promise.defer;e.Promise.defer=function(){var t=o.call(e.Promise);return t.makeNodeResolver=function(){var e=this;return function(t){if(t)e.reject(t);else{var r=arguments[1];if(arguments.length>2){r=[];for(var o=1;o<arguments.length;o++)r.push(arguments[o])}e.resolve(r)}}},t},Object.prototype.$promise||Object.defineProperty(Object.prototype,"$promise",{enumerable:!1,get:function(){var t=this;return function(r){var o=[].slice.call(arguments,1);return e.Promise.npost(t,r,o)}}}),"undefined"!=typeof module&&(module.exports=e.Promise)}("undefined"==typeof global?window:global);