Bez popisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

es6-promise.debug.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /*!
  2. Copyright (c) 2014 Roman Dvornov
  3. */
  4. var OfficeExtension = OfficeExtension || {};
  5. (function (global) {
  6. var NativePromise = global['Promise'];
  7. var nativePromiseSupported = NativePromise &&
  8. 'resolve' in NativePromise &&
  9. 'reject' in NativePromise &&
  10. 'all' in NativePromise &&
  11. 'race' in NativePromise &&
  12. (function () {
  13. var resolve;
  14. new NativePromise(function (r) { resolve = r; });
  15. return typeof resolve === 'function';
  16. })();
  17. if (nativePromiseSupported)
  18. return;
  19. var PENDING = 'pending';
  20. var SEALED = 'sealed';
  21. var FULFILLED = 'fulfilled';
  22. var REJECTED = 'rejected';
  23. var NOOP = function () { };
  24. function isArray(value) {
  25. return Object.prototype.toString.call(value) === '[object Array]';
  26. }
  27. var asyncSetTimer = typeof setImmediate !== 'undefined' ? setImmediate : setTimeout;
  28. var asyncQueue = [];
  29. var asyncTimer;
  30. function asyncFlush() {
  31. for (var i = 0; i < asyncQueue.length; i++)
  32. asyncQueue[i][0](asyncQueue[i][1]);
  33. asyncQueue = [];
  34. asyncTimer = false;
  35. }
  36. function asyncCall(callback, arg) {
  37. asyncQueue.push([callback, arg]);
  38. if (!asyncTimer) {
  39. asyncTimer = true;
  40. asyncSetTimer(asyncFlush, 0);
  41. }
  42. }
  43. function invokeResolver(resolver, promise) {
  44. function resolvePromise(value) {
  45. resolve(promise, value);
  46. }
  47. function rejectPromise(reason) {
  48. reject(promise, reason);
  49. }
  50. try {
  51. resolver(resolvePromise, rejectPromise);
  52. }
  53. catch (e) {
  54. rejectPromise(e);
  55. }
  56. }
  57. function invokeCallback(subscriber) {
  58. var owner = subscriber.owner;
  59. var settled = owner.state_;
  60. var value = owner.data_;
  61. var callback = subscriber[settled];
  62. var promise = subscriber.then;
  63. if (typeof callback === 'function') {
  64. settled = FULFILLED;
  65. try {
  66. value = callback(value);
  67. }
  68. catch (e) {
  69. reject(promise, e);
  70. }
  71. }
  72. if (!handleThenable(promise, value)) {
  73. if (settled === FULFILLED)
  74. resolve(promise, value);
  75. if (settled === REJECTED)
  76. reject(promise, value);
  77. }
  78. }
  79. function handleThenable(promise, value) {
  80. var resolved;
  81. try {
  82. if (promise === value)
  83. throw new TypeError('A promises callback cannot return that same promise.');
  84. if (value && (typeof value === 'function' || typeof value === 'object')) {
  85. var then = value.then;
  86. if (typeof then === 'function') {
  87. then.call(value, function (val) {
  88. if (!resolved) {
  89. resolved = true;
  90. if (value !== val)
  91. resolve(promise, val);
  92. else
  93. fulfill(promise, val);
  94. }
  95. }, function (reason) {
  96. if (!resolved) {
  97. resolved = true;
  98. reject(promise, reason);
  99. }
  100. });
  101. return true;
  102. }
  103. }
  104. }
  105. catch (e) {
  106. if (!resolved)
  107. reject(promise, e);
  108. return true;
  109. }
  110. return false;
  111. }
  112. function resolve(promise, value) {
  113. if (promise === value || !handleThenable(promise, value))
  114. fulfill(promise, value);
  115. }
  116. function fulfill(promise, value) {
  117. if (promise.state_ === PENDING) {
  118. promise.state_ = SEALED;
  119. promise.data_ = value;
  120. asyncCall(publishFulfillment, promise);
  121. }
  122. }
  123. function reject(promise, reason) {
  124. if (promise.state_ === PENDING) {
  125. promise.state_ = SEALED;
  126. promise.data_ = reason;
  127. asyncCall(publishRejection, promise);
  128. }
  129. }
  130. function publish(promise) {
  131. var callbacks = promise.then_;
  132. promise.then_ = undefined;
  133. for (var i = 0; i < callbacks.length; i++) {
  134. invokeCallback(callbacks[i]);
  135. }
  136. }
  137. function publishFulfillment(promise) {
  138. promise.state_ = FULFILLED;
  139. publish(promise);
  140. }
  141. function publishRejection(promise) {
  142. promise.state_ = REJECTED;
  143. publish(promise);
  144. }
  145. var Promise = function (resolver) {
  146. if (typeof resolver !== 'function')
  147. throw new TypeError('Promise constructor takes a function argument');
  148. if (this instanceof Promise === false)
  149. throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
  150. this.then_ = [];
  151. invokeResolver(resolver, this);
  152. };
  153. Promise.prototype = {
  154. constructor: Promise,
  155. state_: PENDING,
  156. then_: null,
  157. data_: undefined,
  158. then: function (onFulfillment, onRejection) {
  159. var subscriber = {
  160. owner: this,
  161. then: new this.constructor(NOOP),
  162. fulfilled: onFulfillment,
  163. rejected: onRejection
  164. };
  165. if (this.state_ === FULFILLED || this.state_ === REJECTED) {
  166. asyncCall(invokeCallback, subscriber);
  167. }
  168. else {
  169. this.then_.push(subscriber);
  170. }
  171. return subscriber.then;
  172. },
  173. 'catch': function (onRejection) {
  174. return this.then(null, onRejection);
  175. }
  176. };
  177. Promise.all = function (promises) {
  178. var Class = this;
  179. if (!isArray(promises))
  180. throw new TypeError('You must pass an array to Promise.all().');
  181. return new Class(function (resolve, reject) {
  182. var results = [];
  183. var remaining = 0;
  184. function resolver(index) {
  185. remaining++;
  186. return function (value) {
  187. results[index] = value;
  188. if (!--remaining)
  189. resolve(results);
  190. };
  191. }
  192. for (var i = 0, promise; i < promises.length; i++) {
  193. promise = promises[i];
  194. if (promise && typeof promise.then === 'function')
  195. promise.then(resolver(i), reject);
  196. else
  197. results[i] = promise;
  198. }
  199. if (!remaining)
  200. resolve(results);
  201. });
  202. };
  203. Promise.race = function (promises) {
  204. var Class = this;
  205. if (!isArray(promises))
  206. throw new TypeError('You must pass an array to Promise.race().');
  207. return new Class(function (resolve, reject) {
  208. for (var i = 0, promise; i < promises.length; i++) {
  209. promise = promises[i];
  210. if (promise && typeof promise.then === 'function')
  211. promise.then(resolve, reject);
  212. else
  213. resolve(promise);
  214. }
  215. });
  216. };
  217. Promise.resolve = function (value) {
  218. var Class = this;
  219. if (value && typeof value === 'object' && value.constructor === Class)
  220. return value;
  221. return new Class(function (resolve) {
  222. resolve(value);
  223. });
  224. };
  225. Promise.reject = function (reason) {
  226. var Class = this;
  227. return new Class(function (resolve, reject) {
  228. reject(reason);
  229. });
  230. };
  231. global['Promise'] = Promise;
  232. })(OfficeExtension);