deprecated-sync-thenables.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. /**
  5. * THIS MODULE IS DEPRECATED. IMPORT "Promise.jsm" INSTEAD.
  6. */
  7. "use strict";
  8. this.Promise = {};
  9. if (typeof (require) === "function") {
  10. module.exports = Promise;
  11. } else {
  12. this.EXPORTED_SYMBOLS = ["Promise"];
  13. }
  14. function fulfilled(value) {
  15. return { then: function then(fulfill) { fulfill(value); } };
  16. }
  17. function rejected(reason) {
  18. return { then: function then(fulfill, reject) { reject(reason); } };
  19. }
  20. function isPromise(value) {
  21. return value && typeof (value.then) === "function";
  22. }
  23. function defer() {
  24. var observers = [];
  25. var result = null;
  26. var promise = {
  27. then: function then(onFulfill, onError) {
  28. var deferred = defer();
  29. function resolve(value) {
  30. try {
  31. deferred.resolve(onFulfill ? onFulfill(value) : value);
  32. } catch (error) {
  33. deferred.resolve(rejected(error));
  34. }
  35. }
  36. function reject(reason) {
  37. try {
  38. if (onError) deferred.resolve(onError(reason));
  39. else deferred.resolve(rejected(reason));
  40. } catch (error) {
  41. deferred.resolve(rejected(error));
  42. }
  43. }
  44. if (observers) {
  45. observers.push({ resolve: resolve, reject: reject });
  46. } else {
  47. result.then(resolve, reject);
  48. }
  49. return deferred.promise;
  50. }
  51. };
  52. var deferred = {
  53. promise: promise,
  54. resolve: function resolve(value) {
  55. if (!result) {
  56. result = isPromise(value) ? value : fulfilled(value);
  57. while (observers.length) {
  58. var observer = observers.shift();
  59. result.then(observer.resolve, observer.reject);
  60. }
  61. observers = null;
  62. }
  63. },
  64. reject: function reject(reason) {
  65. deferred.resolve(rejected(reason));
  66. }
  67. };
  68. return deferred;
  69. }
  70. Promise.defer = defer;
  71. function resolve(value) {
  72. var deferred = defer();
  73. deferred.resolve(value);
  74. return deferred.promise;
  75. }
  76. Promise.resolve = resolve;
  77. function reject(reason) {
  78. var deferred = defer();
  79. deferred.reject(reason);
  80. return deferred.promise;
  81. }
  82. Promise.reject = reject;
  83. var promised = (function () {
  84. var call = Function.call;
  85. var concat = Array.prototype.concat;
  86. function execute(args) { return call.apply(call, args); }
  87. function promisedConcat(promises, unknown) {
  88. return promises.then(function (values) {
  89. return resolve(unknown).then(function (value) {
  90. return values.concat([ value ]);
  91. });
  92. });
  93. }
  94. return function promised(f) {
  95. return function promised() {
  96. return concat.apply([ f, this ], arguments).
  97. reduce(promisedConcat, resolve([])).
  98. then(execute);
  99. };
  100. };
  101. })();
  102. Promise.all = promised(Array);