promise.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. "use strict";
  2. module.exports = function() {
  3. var makeSelfResolutionError = function () {
  4. return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a");
  5. };
  6. var reflectHandler = function() {
  7. return new Promise.PromiseInspection(this._target());
  8. };
  9. var apiRejection = function(msg) {
  10. return Promise.reject(new TypeError(msg));
  11. };
  12. function Proxyable() {}
  13. var UNDEFINED_BINDING = {};
  14. var util = require("./util");
  15. var getDomain;
  16. if (util.isNode) {
  17. getDomain = function() {
  18. var ret = process.domain;
  19. if (ret === undefined) ret = null;
  20. return ret;
  21. };
  22. } else {
  23. getDomain = function() {
  24. return null;
  25. };
  26. }
  27. util.notEnumerableProp(Promise, "_getDomain", getDomain);
  28. var es5 = require("./es5");
  29. var Async = require("./async");
  30. var async = new Async();
  31. es5.defineProperty(Promise, "_async", {value: async});
  32. var errors = require("./errors");
  33. var TypeError = Promise.TypeError = errors.TypeError;
  34. Promise.RangeError = errors.RangeError;
  35. var CancellationError = Promise.CancellationError = errors.CancellationError;
  36. Promise.TimeoutError = errors.TimeoutError;
  37. Promise.OperationalError = errors.OperationalError;
  38. Promise.RejectionError = errors.OperationalError;
  39. Promise.AggregateError = errors.AggregateError;
  40. var INTERNAL = function(){};
  41. var APPLY = {};
  42. var NEXT_FILTER = {};
  43. var tryConvertToPromise = require("./thenables")(Promise, INTERNAL);
  44. var PromiseArray =
  45. require("./promise_array")(Promise, INTERNAL,
  46. tryConvertToPromise, apiRejection, Proxyable);
  47. var Context = require("./context")(Promise);
  48. /*jshint unused:false*/
  49. var createContext = Context.create;
  50. var debug = require("./debuggability")(Promise, Context);
  51. var CapturedTrace = debug.CapturedTrace;
  52. var PassThroughHandlerContext =
  53. require("./finally")(Promise, tryConvertToPromise);
  54. var catchFilter = require("./catch_filter")(NEXT_FILTER);
  55. var nodebackForPromise = require("./nodeback");
  56. var errorObj = util.errorObj;
  57. var tryCatch = util.tryCatch;
  58. function check(self, executor) {
  59. if (typeof executor !== "function") {
  60. throw new TypeError("expecting a function but got " + util.classString(executor));
  61. }
  62. if (self.constructor !== Promise) {
  63. throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a");
  64. }
  65. }
  66. function Promise(executor) {
  67. this._bitField = 0;
  68. this._fulfillmentHandler0 = undefined;
  69. this._rejectionHandler0 = undefined;
  70. this._promise0 = undefined;
  71. this._receiver0 = undefined;
  72. if (executor !== INTERNAL) {
  73. check(this, executor);
  74. this._resolveFromExecutor(executor);
  75. }
  76. this._promiseCreated();
  77. this._fireEvent("promiseCreated", this);
  78. }
  79. Promise.prototype.toString = function () {
  80. return "[object Promise]";
  81. };
  82. Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
  83. var len = arguments.length;
  84. if (len > 1) {
  85. var catchInstances = new Array(len - 1),
  86. j = 0, i;
  87. for (i = 0; i < len - 1; ++i) {
  88. var item = arguments[i];
  89. if (util.isObject(item)) {
  90. catchInstances[j++] = item;
  91. } else {
  92. return apiRejection("expecting an object but got " + util.classString(item));
  93. }
  94. }
  95. catchInstances.length = j;
  96. fn = arguments[i];
  97. return this.then(undefined, catchFilter(catchInstances, fn, this));
  98. }
  99. return this.then(undefined, fn);
  100. };
  101. Promise.prototype.reflect = function () {
  102. return this._then(reflectHandler,
  103. reflectHandler, undefined, this, undefined);
  104. };
  105. Promise.prototype.then = function (didFulfill, didReject) {
  106. if (debug.warnings() && arguments.length > 0 &&
  107. typeof didFulfill !== "function" &&
  108. typeof didReject !== "function") {
  109. var msg = ".then() only accepts functions but was passed: " +
  110. util.classString(didFulfill);
  111. if (arguments.length > 1) {
  112. msg += ", " + util.classString(didReject);
  113. }
  114. this._warn(msg);
  115. }
  116. return this._then(didFulfill, didReject, undefined, undefined, undefined);
  117. };
  118. Promise.prototype.done = function (didFulfill, didReject) {
  119. var promise =
  120. this._then(didFulfill, didReject, undefined, undefined, undefined);
  121. promise._setIsFinal();
  122. };
  123. Promise.prototype.spread = function (fn) {
  124. if (typeof fn !== "function") {
  125. return apiRejection("expecting a function but got " + util.classString(fn));
  126. }
  127. return this.all()._then(fn, undefined, undefined, APPLY, undefined);
  128. };
  129. Promise.prototype.toJSON = function () {
  130. var ret = {
  131. isFulfilled: false,
  132. isRejected: false,
  133. fulfillmentValue: undefined,
  134. rejectionReason: undefined
  135. };
  136. if (this.isFulfilled()) {
  137. ret.fulfillmentValue = this.value();
  138. ret.isFulfilled = true;
  139. } else if (this.isRejected()) {
  140. ret.rejectionReason = this.reason();
  141. ret.isRejected = true;
  142. }
  143. return ret;
  144. };
  145. Promise.prototype.all = function () {
  146. if (arguments.length > 0) {
  147. this._warn(".all() was passed arguments but it does not take any");
  148. }
  149. return new PromiseArray(this).promise();
  150. };
  151. Promise.prototype.error = function (fn) {
  152. return this.caught(util.originatesFromRejection, fn);
  153. };
  154. Promise.is = function (val) {
  155. return val instanceof Promise;
  156. };
  157. Promise.fromNode = Promise.fromCallback = function(fn) {
  158. var ret = new Promise(INTERNAL);
  159. ret._captureStackTrace();
  160. var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
  161. : false;
  162. var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
  163. if (result === errorObj) {
  164. ret._rejectCallback(result.e, true);
  165. }
  166. if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
  167. return ret;
  168. };
  169. Promise.all = function (promises) {
  170. return new PromiseArray(promises).promise();
  171. };
  172. Promise.cast = function (obj) {
  173. var ret = tryConvertToPromise(obj);
  174. if (!(ret instanceof Promise)) {
  175. ret = new Promise(INTERNAL);
  176. ret._captureStackTrace();
  177. ret._setFulfilled();
  178. ret._rejectionHandler0 = obj;
  179. }
  180. return ret;
  181. };
  182. Promise.resolve = Promise.fulfilled = Promise.cast;
  183. Promise.reject = Promise.rejected = function (reason) {
  184. var ret = new Promise(INTERNAL);
  185. ret._captureStackTrace();
  186. ret._rejectCallback(reason, true);
  187. return ret;
  188. };
  189. Promise.setScheduler = function(fn) {
  190. if (typeof fn !== "function") {
  191. throw new TypeError("expecting a function but got " + util.classString(fn));
  192. }
  193. var prev = async._schedule;
  194. async._schedule = fn;
  195. return prev;
  196. };
  197. Promise.prototype._then = function (
  198. didFulfill,
  199. didReject,
  200. _, receiver,
  201. internalData
  202. ) {
  203. var haveInternalData = internalData !== undefined;
  204. var promise = haveInternalData ? internalData : new Promise(INTERNAL);
  205. var target = this._target();
  206. var bitField = target._bitField;
  207. if (!haveInternalData) {
  208. promise._propagateFrom(this, 3);
  209. promise._captureStackTrace();
  210. if (receiver === undefined &&
  211. ((this._bitField & 2097152) !== 0)) {
  212. if (!((bitField & 50397184) === 0)) {
  213. receiver = this._boundValue();
  214. } else {
  215. receiver = target === this ? undefined : this._boundTo;
  216. }
  217. }
  218. this._fireEvent("promiseChained", this, promise);
  219. }
  220. var domain = getDomain();
  221. if (!((bitField & 50397184) === 0)) {
  222. var handler, value, settler = target._settlePromiseCtx;
  223. if (((bitField & 33554432) !== 0)) {
  224. value = target._rejectionHandler0;
  225. handler = didFulfill;
  226. } else if (((bitField & 16777216) !== 0)) {
  227. value = target._fulfillmentHandler0;
  228. handler = didReject;
  229. target._unsetRejectionIsUnhandled();
  230. } else {
  231. settler = target._settlePromiseLateCancellationObserver;
  232. value = new CancellationError("late cancellation observer");
  233. target._attachExtraTrace(value);
  234. handler = didReject;
  235. }
  236. async.invoke(settler, target, {
  237. handler: domain === null ? handler
  238. : (typeof handler === "function" && domain.bind(handler)),
  239. promise: promise,
  240. receiver: receiver,
  241. value: value
  242. });
  243. } else {
  244. target._addCallbacks(didFulfill, didReject, promise, receiver, domain);
  245. }
  246. return promise;
  247. };
  248. Promise.prototype._length = function () {
  249. return this._bitField & 65535;
  250. };
  251. Promise.prototype._isFateSealed = function () {
  252. return (this._bitField & 117506048) !== 0;
  253. };
  254. Promise.prototype._isFollowing = function () {
  255. return (this._bitField & 67108864) === 67108864;
  256. };
  257. Promise.prototype._setLength = function (len) {
  258. this._bitField = (this._bitField & -65536) |
  259. (len & 65535);
  260. };
  261. Promise.prototype._setFulfilled = function () {
  262. this._bitField = this._bitField | 33554432;
  263. this._fireEvent("promiseFulfilled", this);
  264. };
  265. Promise.prototype._setRejected = function () {
  266. this._bitField = this._bitField | 16777216;
  267. this._fireEvent("promiseRejected", this);
  268. };
  269. Promise.prototype._setFollowing = function () {
  270. this._bitField = this._bitField | 67108864;
  271. this._fireEvent("promiseResolved", this);
  272. };
  273. Promise.prototype._setIsFinal = function () {
  274. this._bitField = this._bitField | 4194304;
  275. };
  276. Promise.prototype._isFinal = function () {
  277. return (this._bitField & 4194304) > 0;
  278. };
  279. Promise.prototype._unsetCancelled = function() {
  280. this._bitField = this._bitField & (~65536);
  281. };
  282. Promise.prototype._setCancelled = function() {
  283. this._bitField = this._bitField | 65536;
  284. this._fireEvent("promiseCancelled", this);
  285. };
  286. Promise.prototype._setAsyncGuaranteed = function() {
  287. this._bitField = this._bitField | 134217728;
  288. };
  289. Promise.prototype._receiverAt = function (index) {
  290. var ret = index === 0 ? this._receiver0 : this[
  291. index * 4 - 4 + 3];
  292. if (ret === UNDEFINED_BINDING) {
  293. return undefined;
  294. } else if (ret === undefined && this._isBound()) {
  295. return this._boundValue();
  296. }
  297. return ret;
  298. };
  299. Promise.prototype._promiseAt = function (index) {
  300. return this[
  301. index * 4 - 4 + 2];
  302. };
  303. Promise.prototype._fulfillmentHandlerAt = function (index) {
  304. return this[
  305. index * 4 - 4 + 0];
  306. };
  307. Promise.prototype._rejectionHandlerAt = function (index) {
  308. return this[
  309. index * 4 - 4 + 1];
  310. };
  311. Promise.prototype._boundValue = function() {};
  312. Promise.prototype._migrateCallback0 = function (follower) {
  313. var bitField = follower._bitField;
  314. var fulfill = follower._fulfillmentHandler0;
  315. var reject = follower._rejectionHandler0;
  316. var promise = follower._promise0;
  317. var receiver = follower._receiverAt(0);
  318. if (receiver === undefined) receiver = UNDEFINED_BINDING;
  319. this._addCallbacks(fulfill, reject, promise, receiver, null);
  320. };
  321. Promise.prototype._migrateCallbackAt = function (follower, index) {
  322. var fulfill = follower._fulfillmentHandlerAt(index);
  323. var reject = follower._rejectionHandlerAt(index);
  324. var promise = follower._promiseAt(index);
  325. var receiver = follower._receiverAt(index);
  326. if (receiver === undefined) receiver = UNDEFINED_BINDING;
  327. this._addCallbacks(fulfill, reject, promise, receiver, null);
  328. };
  329. Promise.prototype._addCallbacks = function (
  330. fulfill,
  331. reject,
  332. promise,
  333. receiver,
  334. domain
  335. ) {
  336. var index = this._length();
  337. if (index >= 65535 - 4) {
  338. index = 0;
  339. this._setLength(0);
  340. }
  341. if (index === 0) {
  342. this._promise0 = promise;
  343. this._receiver0 = receiver;
  344. if (typeof fulfill === "function") {
  345. this._fulfillmentHandler0 =
  346. domain === null ? fulfill : domain.bind(fulfill);
  347. }
  348. if (typeof reject === "function") {
  349. this._rejectionHandler0 =
  350. domain === null ? reject : domain.bind(reject);
  351. }
  352. } else {
  353. var base = index * 4 - 4;
  354. this[base + 2] = promise;
  355. this[base + 3] = receiver;
  356. if (typeof fulfill === "function") {
  357. this[base + 0] =
  358. domain === null ? fulfill : domain.bind(fulfill);
  359. }
  360. if (typeof reject === "function") {
  361. this[base + 1] =
  362. domain === null ? reject : domain.bind(reject);
  363. }
  364. }
  365. this._setLength(index + 1);
  366. return index;
  367. };
  368. Promise.prototype._proxy = function (proxyable, arg) {
  369. this._addCallbacks(undefined, undefined, arg, proxyable, null);
  370. };
  371. Promise.prototype._resolveCallback = function(value, shouldBind) {
  372. if (((this._bitField & 117506048) !== 0)) return;
  373. if (value === this)
  374. return this._rejectCallback(makeSelfResolutionError(), false);
  375. var maybePromise = tryConvertToPromise(value, this);
  376. if (!(maybePromise instanceof Promise)) return this._fulfill(value);
  377. if (shouldBind) this._propagateFrom(maybePromise, 2);
  378. var promise = maybePromise._target();
  379. if (promise === this) {
  380. this._reject(makeSelfResolutionError());
  381. return;
  382. }
  383. var bitField = promise._bitField;
  384. if (((bitField & 50397184) === 0)) {
  385. var len = this._length();
  386. if (len > 0) promise._migrateCallback0(this);
  387. for (var i = 1; i < len; ++i) {
  388. promise._migrateCallbackAt(this, i);
  389. }
  390. this._setFollowing();
  391. this._setLength(0);
  392. this._setFollowee(promise);
  393. } else if (((bitField & 33554432) !== 0)) {
  394. this._fulfill(promise._value());
  395. } else if (((bitField & 16777216) !== 0)) {
  396. this._reject(promise._reason());
  397. } else {
  398. var reason = new CancellationError("late cancellation observer");
  399. promise._attachExtraTrace(reason);
  400. this._reject(reason);
  401. }
  402. };
  403. Promise.prototype._rejectCallback =
  404. function(reason, synchronous, ignoreNonErrorWarnings) {
  405. var trace = util.ensureErrorObject(reason);
  406. var hasStack = trace === reason;
  407. if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
  408. var message = "a promise was rejected with a non-error: " +
  409. util.classString(reason);
  410. this._warn(message, true);
  411. }
  412. this._attachExtraTrace(trace, synchronous ? hasStack : false);
  413. this._reject(reason);
  414. };
  415. Promise.prototype._resolveFromExecutor = function (executor) {
  416. var promise = this;
  417. this._captureStackTrace();
  418. this._pushContext();
  419. var synchronous = true;
  420. var r = this._execute(executor, function(value) {
  421. promise._resolveCallback(value);
  422. }, function (reason) {
  423. promise._rejectCallback(reason, synchronous);
  424. });
  425. synchronous = false;
  426. this._popContext();
  427. if (r !== undefined) {
  428. promise._rejectCallback(r, true);
  429. }
  430. };
  431. Promise.prototype._settlePromiseFromHandler = function (
  432. handler, receiver, value, promise
  433. ) {
  434. var bitField = promise._bitField;
  435. if (((bitField & 65536) !== 0)) return;
  436. promise._pushContext();
  437. var x;
  438. if (receiver === APPLY) {
  439. if (!value || typeof value.length !== "number") {
  440. x = errorObj;
  441. x.e = new TypeError("cannot .spread() a non-array: " +
  442. util.classString(value));
  443. } else {
  444. x = tryCatch(handler).apply(this._boundValue(), value);
  445. }
  446. } else {
  447. x = tryCatch(handler).call(receiver, value);
  448. }
  449. var promiseCreated = promise._popContext();
  450. bitField = promise._bitField;
  451. if (((bitField & 65536) !== 0)) return;
  452. if (x === NEXT_FILTER) {
  453. promise._reject(value);
  454. } else if (x === errorObj) {
  455. promise._rejectCallback(x.e, false);
  456. } else {
  457. debug.checkForgottenReturns(x, promiseCreated, "", promise, this);
  458. promise._resolveCallback(x);
  459. }
  460. };
  461. Promise.prototype._target = function() {
  462. var ret = this;
  463. while (ret._isFollowing()) ret = ret._followee();
  464. return ret;
  465. };
  466. Promise.prototype._followee = function() {
  467. return this._rejectionHandler0;
  468. };
  469. Promise.prototype._setFollowee = function(promise) {
  470. this._rejectionHandler0 = promise;
  471. };
  472. Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
  473. var isPromise = promise instanceof Promise;
  474. var bitField = this._bitField;
  475. var asyncGuaranteed = ((bitField & 134217728) !== 0);
  476. if (((bitField & 65536) !== 0)) {
  477. if (isPromise) promise._invokeInternalOnCancel();
  478. if (receiver instanceof PassThroughHandlerContext &&
  479. receiver.isFinallyHandler()) {
  480. receiver.cancelPromise = promise;
  481. if (tryCatch(handler).call(receiver, value) === errorObj) {
  482. promise._reject(errorObj.e);
  483. }
  484. } else if (handler === reflectHandler) {
  485. promise._fulfill(reflectHandler.call(receiver));
  486. } else if (receiver instanceof Proxyable) {
  487. receiver._promiseCancelled(promise);
  488. } else if (isPromise || promise instanceof PromiseArray) {
  489. promise._cancel();
  490. } else {
  491. receiver.cancel();
  492. }
  493. } else if (typeof handler === "function") {
  494. if (!isPromise) {
  495. handler.call(receiver, value, promise);
  496. } else {
  497. if (asyncGuaranteed) promise._setAsyncGuaranteed();
  498. this._settlePromiseFromHandler(handler, receiver, value, promise);
  499. }
  500. } else if (receiver instanceof Proxyable) {
  501. if (!receiver._isResolved()) {
  502. if (((bitField & 33554432) !== 0)) {
  503. receiver._promiseFulfilled(value, promise);
  504. } else {
  505. receiver._promiseRejected(value, promise);
  506. }
  507. }
  508. } else if (isPromise) {
  509. if (asyncGuaranteed) promise._setAsyncGuaranteed();
  510. if (((bitField & 33554432) !== 0)) {
  511. promise._fulfill(value);
  512. } else {
  513. promise._reject(value);
  514. }
  515. }
  516. };
  517. Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
  518. var handler = ctx.handler;
  519. var promise = ctx.promise;
  520. var receiver = ctx.receiver;
  521. var value = ctx.value;
  522. if (typeof handler === "function") {
  523. if (!(promise instanceof Promise)) {
  524. handler.call(receiver, value, promise);
  525. } else {
  526. this._settlePromiseFromHandler(handler, receiver, value, promise);
  527. }
  528. } else if (promise instanceof Promise) {
  529. promise._reject(value);
  530. }
  531. };
  532. Promise.prototype._settlePromiseCtx = function(ctx) {
  533. this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
  534. };
  535. Promise.prototype._settlePromise0 = function(handler, value, bitField) {
  536. var promise = this._promise0;
  537. var receiver = this._receiverAt(0);
  538. this._promise0 = undefined;
  539. this._receiver0 = undefined;
  540. this._settlePromise(promise, handler, receiver, value);
  541. };
  542. Promise.prototype._clearCallbackDataAtIndex = function(index) {
  543. var base = index * 4 - 4;
  544. this[base + 2] =
  545. this[base + 3] =
  546. this[base + 0] =
  547. this[base + 1] = undefined;
  548. };
  549. Promise.prototype._fulfill = function (value) {
  550. var bitField = this._bitField;
  551. if (((bitField & 117506048) >>> 16)) return;
  552. if (value === this) {
  553. var err = makeSelfResolutionError();
  554. this._attachExtraTrace(err);
  555. return this._reject(err);
  556. }
  557. this._setFulfilled();
  558. this._rejectionHandler0 = value;
  559. if ((bitField & 65535) > 0) {
  560. if (((bitField & 134217728) !== 0)) {
  561. this._settlePromises();
  562. } else {
  563. async.settlePromises(this);
  564. }
  565. }
  566. };
  567. Promise.prototype._reject = function (reason) {
  568. var bitField = this._bitField;
  569. if (((bitField & 117506048) >>> 16)) return;
  570. this._setRejected();
  571. this._fulfillmentHandler0 = reason;
  572. if (this._isFinal()) {
  573. return async.fatalError(reason, util.isNode);
  574. }
  575. if ((bitField & 65535) > 0) {
  576. async.settlePromises(this);
  577. } else {
  578. this._ensurePossibleRejectionHandled();
  579. }
  580. };
  581. Promise.prototype._fulfillPromises = function (len, value) {
  582. for (var i = 1; i < len; i++) {
  583. var handler = this._fulfillmentHandlerAt(i);
  584. var promise = this._promiseAt(i);
  585. var receiver = this._receiverAt(i);
  586. this._clearCallbackDataAtIndex(i);
  587. this._settlePromise(promise, handler, receiver, value);
  588. }
  589. };
  590. Promise.prototype._rejectPromises = function (len, reason) {
  591. for (var i = 1; i < len; i++) {
  592. var handler = this._rejectionHandlerAt(i);
  593. var promise = this._promiseAt(i);
  594. var receiver = this._receiverAt(i);
  595. this._clearCallbackDataAtIndex(i);
  596. this._settlePromise(promise, handler, receiver, reason);
  597. }
  598. };
  599. Promise.prototype._settlePromises = function () {
  600. var bitField = this._bitField;
  601. var len = (bitField & 65535);
  602. if (len > 0) {
  603. if (((bitField & 16842752) !== 0)) {
  604. var reason = this._fulfillmentHandler0;
  605. this._settlePromise0(this._rejectionHandler0, reason, bitField);
  606. this._rejectPromises(len, reason);
  607. } else {
  608. var value = this._rejectionHandler0;
  609. this._settlePromise0(this._fulfillmentHandler0, value, bitField);
  610. this._fulfillPromises(len, value);
  611. }
  612. this._setLength(0);
  613. }
  614. this._clearCancellationData();
  615. };
  616. Promise.prototype._settledValue = function() {
  617. var bitField = this._bitField;
  618. if (((bitField & 33554432) !== 0)) {
  619. return this._rejectionHandler0;
  620. } else if (((bitField & 16777216) !== 0)) {
  621. return this._fulfillmentHandler0;
  622. }
  623. };
  624. function deferResolve(v) {this.promise._resolveCallback(v);}
  625. function deferReject(v) {this.promise._rejectCallback(v, false);}
  626. Promise.defer = Promise.pending = function() {
  627. debug.deprecated("Promise.defer", "new Promise");
  628. var promise = new Promise(INTERNAL);
  629. return {
  630. promise: promise,
  631. resolve: deferResolve,
  632. reject: deferReject
  633. };
  634. };
  635. util.notEnumerableProp(Promise,
  636. "_makeSelfResolutionError",
  637. makeSelfResolutionError);
  638. require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
  639. debug);
  640. require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
  641. require("./cancel")(Promise, PromiseArray, apiRejection, debug);
  642. require("./direct_resolve")(Promise);
  643. require("./synchronous_inspection")(Promise);
  644. require("./join")(
  645. Promise, PromiseArray, tryConvertToPromise, INTERNAL, debug);
  646. Promise.Promise = Promise;
  647. require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
  648. require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
  649. require('./timers.js')(Promise, INTERNAL, debug);
  650. require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
  651. require('./nodeify.js')(Promise);
  652. require('./call_get.js')(Promise);
  653. require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
  654. require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
  655. require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
  656. require('./settle.js')(Promise, PromiseArray, debug);
  657. require('./some.js')(Promise, PromiseArray, apiRejection);
  658. require('./promisify.js')(Promise, INTERNAL);
  659. require('./any.js')(Promise);
  660. require('./each.js')(Promise, INTERNAL);
  661. require('./filter.js')(Promise, INTERNAL);
  662. util.toFastProperties(Promise);
  663. util.toFastProperties(Promise.prototype);
  664. function fillTypes(value) {
  665. var p = new Promise(INTERNAL);
  666. p._fulfillmentHandler0 = value;
  667. p._rejectionHandler0 = value;
  668. p._promise0 = value;
  669. p._receiver0 = value;
  670. }
  671. // Complete slack tracking, opt out of field-type tracking and
  672. // stabilize map
  673. fillTypes({a: 1});
  674. fillTypes({b: 2});
  675. fillTypes({c: 3});
  676. fillTypes(1);
  677. fillTypes(function(){});
  678. fillTypes(undefined);
  679. fillTypes(false);
  680. fillTypes(new Promise(INTERNAL));
  681. debug.setBounds(Async.firstLineError, util.lastLineError);
  682. return Promise;
  683. };