forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathAsync.js
More file actions
1 lines (1 loc) · 4.87 KB
/
Async.js
File metadata and controls
1 lines (1 loc) · 4.87 KB
1
define(function(require,exports,module){function doInParallel(items,beginProcessItem,failFast){var promises=[],masterDeferred=new $.Deferred;if(0===items.length)masterDeferred.resolve();else{var numCompleted=0,hasFailed=!1;items.forEach(function(item,i){var itemPromise=beginProcessItem(item,i);promises.push(itemPromise),itemPromise.fail(function(){failFast?masterDeferred.reject():hasFailed=!0}),itemPromise.always(function(){++numCompleted===items.length&&(hasFailed?masterDeferred.reject():masterDeferred.resolve())})})}return masterDeferred.promise()}function doSequentially(items,beginProcessItem,failAndStopFast){var masterDeferred=new $.Deferred,hasFailed=!1;function doItem(i){if(i>=items.length)hasFailed?masterDeferred.reject():masterDeferred.resolve();else{var itemPromise=beginProcessItem(items[i],i);itemPromise.done(function(){doItem(i+1)}),itemPromise.fail(function(){failAndStopFast?masterDeferred.reject():(hasFailed=!0,doItem(i+1))})}}return doItem(0),masterDeferred.promise()}function doSequentiallyInBackground(items,fnProcessItem,maxBlockingTime,idleTime){maxBlockingTime=maxBlockingTime||15,idleTime=idleTime||30;var sliceStartTime=(new Date).getTime();return doSequentially(items,function(item,i){var result=new $.Deferred;return fnProcessItem(item,i),(new Date).getTime()-sliceStartTime>=maxBlockingTime?window.setTimeout(function(){sliceStartTime=(new Date).getTime(),result.resolve()},idleTime):result.resolve(),result},!1)}function firstSequentially(items,beginProcessItem){var masterDeferred=new $.Deferred;function doItem(i){i>=items.length?masterDeferred.reject():beginProcessItem(items[i],i).fail(function(){doItem(i+1)}).done(function(){masterDeferred.resolve(items[i])})}return doItem(0),masterDeferred.promise()}function doInParallel_aggregateErrors(items,beginProcessItem){var errors=[],masterDeferred=new $.Deferred,parallelResult;return doInParallel(items,function(item,i){var itemResult=beginProcessItem(item,i);return itemResult.fail(function(error){errors.push({item:item,error:error})}),itemResult},!1).done(function(){masterDeferred.resolve()}).fail(function(){masterDeferred.reject(errors)}),masterDeferred.promise()}var ERROR_TIMEOUT={};function withTimeout(promise,timeout,resolveTimeout){var wrapper=new $.Deferred,timer=window.setTimeout(function(){resolveTimeout?wrapper.resolve():wrapper.reject(ERROR_TIMEOUT)},timeout);return promise.always(function(){window.clearTimeout(timer)}),promise.then(wrapper.resolve,wrapper.reject),wrapper.promise()}function waitForAll(promises,failOnReject,timeout){var masterDeferred=new $.Deferred,results=[],count=0,sawRejects=!1;return promises&&0!==promises.length?(failOnReject=void 0!==failOnReject,void 0!==timeout&&withTimeout(masterDeferred,timeout),promises.forEach(function(promise){promise.fail(function(err){sawRejects=!0}).done(function(result){results.push(result)}).always(function(){++count===promises.length&&(failOnReject&&sawRejects?masterDeferred.reject():masterDeferred.resolve(results))})}),masterDeferred.promise()):(masterDeferred.resolve(),masterDeferred.promise())}function chain(functions,args){var deferred=$.Deferred();function chainHelper(index,args){if(functions.length===index)deferred.resolveWith(null,args);else{var nextFunction=functions[index++];try{var responseOrPromise=nextFunction.apply(null,args);responseOrPromise.hasOwnProperty("done")&&responseOrPromise.hasOwnProperty("fail")?(responseOrPromise.done(function(){chainHelper(index,arguments)}),responseOrPromise.fail(function(){deferred.rejectWith(null,arguments)})):chainHelper(index,[responseOrPromise])}catch(e){deferred.reject(e)}}}return chainHelper(0,args||[]),deferred.promise()}function promisify(obj,method){var result=new $.Deferred,args=Array.prototype.slice.call(arguments,2);return args.push(function(err){err?result.reject(err):result.resolve.apply(result,Array.prototype.slice.call(arguments,1))}),obj[method].apply(obj,args),result.promise()}function PromiseQueue(){this._queue=[]}PromiseQueue.prototype._queue=null,PromiseQueue.prototype._curPromise=null,Object.defineProperties(PromiseQueue.prototype,{length:{get:function(){return this._queue.length},set:function(){throw new Error("Cannot set length")}}}),PromiseQueue.prototype.add=function(op){this._queue.push(op),this._curPromise||this._doNext()},PromiseQueue.prototype.removeAll=function(){this._queue=[]},PromiseQueue.prototype._doNext=function(){var self=this;if(this._queue.length){var op=this._queue.shift();this._curPromise=op(),this._curPromise.always(function(){self._curPromise=null,self._doNext()})}},exports.doInParallel=doInParallel,exports.doSequentially=doSequentially,exports.doSequentiallyInBackground=doSequentiallyInBackground,exports.doInParallel_aggregateErrors=doInParallel_aggregateErrors,exports.firstSequentially=firstSequentially,exports.withTimeout=withTimeout,exports.waitForAll=waitForAll,exports.ERROR_TIMEOUT=ERROR_TIMEOUT,exports.chain=chain,exports.promisify=promisify,exports.PromiseQueue=PromiseQueue});