Deferred.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. //>>built
  7. define("dojo/_base/Deferred",["./kernel","../Deferred","../promise/Promise","../errors/CancelError","../has","./lang","../when"],function(_1,_2,_3,_4,_5,_6,_7){
  8. var _8=function(){
  9. };
  10. var _9=Object.freeze||function(){
  11. };
  12. var _a=_1.Deferred=function(_b){
  13. var _c,_d,_e,_f,_10,_11,_12;
  14. var _13=(this.promise=new _3());
  15. function _14(_15){
  16. if(_d){
  17. throw new Error("This deferred has already been resolved");
  18. }
  19. _c=_15;
  20. _d=true;
  21. _16();
  22. };
  23. function _16(){
  24. var _17;
  25. while(!_17&&_12){
  26. var _18=_12;
  27. _12=_12.next;
  28. if((_17=(_18.progress==_8))){
  29. _d=false;
  30. }
  31. var _19=(_10?_18.error:_18.resolved);
  32. if(_5("config-useDeferredInstrumentation")){
  33. if(_10&&_2.instrumentRejected){
  34. _2.instrumentRejected(_c,!!_19);
  35. }
  36. }
  37. if(_19){
  38. try{
  39. var _1a=_19(_c);
  40. if(_1a&&typeof _1a.then==="function"){
  41. _1a.then(_6.hitch(_18.deferred,"resolve"),_6.hitch(_18.deferred,"reject"),_6.hitch(_18.deferred,"progress"));
  42. continue;
  43. }
  44. var _1b=_17&&_1a===undefined;
  45. if(_17&&!_1b){
  46. _10=_1a instanceof Error;
  47. }
  48. _18.deferred[_1b&&_10?"reject":"resolve"](_1b?_c:_1a);
  49. }
  50. catch(e){
  51. _18.deferred.reject(e);
  52. }
  53. }else{
  54. if(_10){
  55. _18.deferred.reject(_c);
  56. }else{
  57. _18.deferred.resolve(_c);
  58. }
  59. }
  60. }
  61. };
  62. this.isResolved=_13.isResolved=function(){
  63. return _f==0;
  64. };
  65. this.isRejected=_13.isRejected=function(){
  66. return _f==1;
  67. };
  68. this.isFulfilled=_13.isFulfilled=function(){
  69. return _f>=0;
  70. };
  71. this.isCanceled=_13.isCanceled=function(){
  72. return _e;
  73. };
  74. this.resolve=this.callback=function(_1c){
  75. this.fired=_f=0;
  76. this.results=[_1c,null];
  77. _14(_1c);
  78. };
  79. this.reject=this.errback=function(_1d){
  80. _10=true;
  81. this.fired=_f=1;
  82. if(_5("config-useDeferredInstrumentation")){
  83. if(_2.instrumentRejected){
  84. _2.instrumentRejected(_1d,!!_12);
  85. }
  86. }
  87. _14(_1d);
  88. this.results=[null,_1d];
  89. };
  90. this.progress=function(_1e){
  91. var _1f=_12;
  92. while(_1f){
  93. var _20=_1f.progress;
  94. _20&&_20(_1e);
  95. _1f=_1f.next;
  96. }
  97. };
  98. this.addCallbacks=function(_21,_22){
  99. this.then(_21,_22,_8);
  100. return this;
  101. };
  102. _13.then=this.then=function(_23,_24,_25){
  103. var _26=_25==_8?this:new _a(_13.cancel);
  104. var _27={resolved:_23,error:_24,progress:_25,deferred:_26};
  105. if(_12){
  106. _11=_11.next=_27;
  107. }else{
  108. _12=_11=_27;
  109. }
  110. if(_d){
  111. _16();
  112. }
  113. return _26.promise;
  114. };
  115. var _28=this;
  116. _13.cancel=this.cancel=function(){
  117. if(!_d){
  118. var _29=_b&&_b(_28);
  119. if(!_d){
  120. if(!(_29 instanceof Error)){
  121. _29=new _4(_29);
  122. }
  123. _29.log=false;
  124. _28.reject(_29);
  125. }
  126. }
  127. _e=true;
  128. };
  129. _9(_13);
  130. };
  131. _6.extend(_a,{addCallback:function(_2a){
  132. return this.addCallbacks(_6.hitch.apply(_1,arguments));
  133. },addErrback:function(_2b){
  134. return this.addCallbacks(null,_6.hitch.apply(_1,arguments));
  135. },addBoth:function(_2c){
  136. var _2d=_6.hitch.apply(_1,arguments);
  137. return this.addCallbacks(_2d,_2d);
  138. },fired:-1});
  139. _a.when=_1.when=_7;
  140. return _a;
  141. });