123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- define("dojo/_base/Deferred", ["./kernel", "./lang"], function(dojo, lang){
-
-
-
-
- var mutator = function(){};
- var freeze = Object.freeze || function(){};
-
- dojo.Deferred = function(/*Function?*/ canceller){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var result, finished, isError, head, nextListener;
- var promise = (this.promise = {});
- function complete(value){
- if(finished){
- throw new Error("This deferred has already been resolved");
- }
- result = value;
- finished = true;
- notify();
- }
- function notify(){
- var mutated;
- while(!mutated && nextListener){
- var listener = nextListener;
- nextListener = nextListener.next;
- if((mutated = (listener.progress == mutator))){
- finished = false;
- }
- var func = (isError ? listener.error : listener.resolved);
- if(func){
- try{
- var newResult = func(result);
- if (newResult && typeof newResult.then === "function"){
- newResult.then(lang.hitch(listener.deferred, "resolve"), lang.hitch(listener.deferred, "reject"), lang.hitch(listener.deferred, "progress"));
- continue;
- }
- var unchanged = mutated && newResult === undefined;
- if(mutated && !unchanged){
- isError = newResult instanceof Error;
- }
- listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
- }catch(e){
- listener.deferred.reject(e);
- }
- }else{
- if(isError){
- listener.deferred.reject(result);
- }else{
- listener.deferred.resolve(result);
- }
- }
- }
- }
-
- this.resolve = this.callback = function(value){
-
-
- this.fired = 0;
- this.results = [value, null];
- complete(value);
- };
-
- this.reject = this.errback = function(error){
-
-
- isError = true;
- this.fired = 1;
- complete(error);
- this.results = [null, error];
- if(!error || error.log !== false){
- (dojo.config.deferredOnError || function(x){ console.error(x); })(error);
- }
- };
-
- this.progress = function(update){
-
-
- var listener = nextListener;
- while(listener){
- var progress = listener.progress;
- progress && progress(update);
- listener = listener.next;
- }
- };
- this.addCallbacks = function(callback, errback){
-
-
-
-
-
-
-
-
- this.then(callback, errback, mutator);
- return this;
- };
-
- promise.then = this.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
- var listener = {
- resolved: resolvedCallback,
- error: errorCallback,
- progress: progressCallback,
- deferred: returnDeferred
- };
- if(nextListener){
- head = head.next = listener;
- }
- else{
- nextListener = head = listener;
- }
- if(finished){
- notify();
- }
- return returnDeferred.promise;
- };
- var deferred = this;
- promise.cancel = this.cancel = function (){
-
-
- if(!finished){
- var error = canceller && canceller(deferred);
- if(!finished){
- if (!(error instanceof Error)){
- error = new Error(error);
- }
- error.log = false;
- deferred.reject(error);
- }
- }
- };
- freeze(promise);
- };
- lang.extend(dojo.Deferred, {
- addCallback: function (/*Function*/ callback){
-
-
-
-
- return this.addCallbacks(lang.hitch.apply(dojo, arguments));
- },
- addErrback: function (/*Function*/ errback){
-
-
-
-
- return this.addCallbacks(null, lang.hitch.apply(dojo, arguments));
- },
- addBoth: function (/*Function*/ callback){
-
-
-
-
- var enclosed = lang.hitch.apply(dojo, arguments);
- return this.addCallbacks(enclosed, enclosed);
- },
- fired: -1
- });
- dojo.Deferred.when = dojo.when = function(promiseOrValue, /*Function?*/ callback, /*Function?*/ errback, /*Function?*/ progressHandler){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if(promiseOrValue && typeof promiseOrValue.then === "function"){
- return promiseOrValue.then(callback, errback, progressHandler);
- }
- return callback ? callback(promiseOrValue) : promiseOrValue;
- };
- return dojo.Deferred;
- });
|