Repository navigation
Expand file tree
/
Copy pathAsync.js
More file actions
1 lines (1 loc) · 6.69 KB
/
Copy pathAsync.js
File metadata and controls
1 lines (1 loc) · 6.69 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()}const RETRY_DEFAULT_DELAYS_MS=[5e3,15e3,3e4,6e4],RETRY_DEFAULT_ATTEMPTS=5,RETRY_DEFAULT_JITTER=.25;function retry(operation,options){const settings=options||{},attempts=Math.max(1,settings.attempts||RETRY_DEFAULT_ATTEMPTS),jitter="number"==typeof settings.jitter?Math.max(0,settings.jitter):RETRY_DEFAULT_JITTER;let delays=void 0===settings.delaysMs?RETRY_DEFAULT_DELAYS_MS:settings.delaysMs;Array.isArray(delays)||(delays=[delays]),delays.length||(delays=[0]);const signal=settings.signal;function waitFor(retryIndex){const base=delays[Math.min(retryIndex,delays.length-1)],spread=base*jitter;return Math.max(0,Math.round(base+(2*Math.random()-1)*spread))}function attemptOnce(attempt){let result;try{result=operation(attempt)}catch(err){return Promise.reject(err)}const promise=Promise.resolve(result);return settings.timeoutMs?new Promise(function(resolve,reject){const timer=window.setTimeout(function(){reject(ERROR_TIMEOUT)},settings.timeoutMs);promise.then(function(value){window.clearTimeout(timer),resolve(value)},function(err){window.clearTimeout(timer),reject(err)})}):promise}return new Promise(function(resolve,reject){if(signal&&signal.aborted)return void reject(signal.reason);let timer=null;function onAbort(){window.clearTimeout(timer),reject(signal.reason)}function finish(settle,value){signal&&signal.removeEventListener("abort",onAbort),settle(value)}function run(attempt){attemptOnce(attempt).then(function(value){finish(resolve,value)},function(err){if(signal&&signal.aborted)return;const more=attempt<attempts&&(!settings.shouldRetry||!1!==settings.shouldRetry(err,attempt));if(!more)return void finish(reject,err);const wait=waitFor(attempt-1);settings.onRetry&&settings.onRetry(err,attempt,wait),timer=window.setTimeout(function(){run(attempt+1)},wait)})}signal&&signal.addEventListener("abort",onAbort,{once:!0}),run(1)})}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.retry=retry,exports.waitForAll=waitForAll,exports.ERROR_TIMEOUT=ERROR_TIMEOUT,exports.chain=chain,exports.promisify=promisify,exports.PromiseQueue=PromiseQueue});