promiseUtils.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.continueWhile = continueWhile;
  6. exports.resolvingPromise = resolvingPromise;
  7. exports.when = when;
  8. // Create Deferred Promise
  9. function resolvingPromise() {
  10. let res;
  11. let rej;
  12. const promise = new Promise((resolve, reject) => {
  13. res = resolve;
  14. rej = reject;
  15. });
  16. const defer = promise;
  17. defer.resolve = res;
  18. defer.reject = rej;
  19. return defer;
  20. }
  21. function when(promises) {
  22. let objects;
  23. const arrayArgument = Array.isArray(promises);
  24. if (arrayArgument) {
  25. objects = promises;
  26. } else {
  27. objects = arguments;
  28. }
  29. let total = objects.length;
  30. let hadError = false;
  31. const results = [];
  32. const returnValue = arrayArgument ? [results] : results;
  33. const errors = [];
  34. results.length = objects.length;
  35. errors.length = objects.length;
  36. if (total === 0) {
  37. return Promise.resolve(returnValue);
  38. }
  39. const promise = resolvingPromise();
  40. const resolveOne = function () {
  41. total--;
  42. if (total <= 0) {
  43. if (hadError) {
  44. promise.reject(errors);
  45. } else {
  46. promise.resolve(returnValue);
  47. }
  48. }
  49. };
  50. const chain = function (object, index) {
  51. if (object && typeof object.then === 'function') {
  52. object.then(function (result) {
  53. results[index] = result;
  54. resolveOne();
  55. }, function (error) {
  56. errors[index] = error;
  57. hadError = true;
  58. resolveOne();
  59. });
  60. } else {
  61. results[index] = object;
  62. resolveOne();
  63. }
  64. };
  65. for (let i = 0; i < objects.length; i++) {
  66. chain(objects[i], i);
  67. }
  68. return promise;
  69. }
  70. function continueWhile(test, emitter) {
  71. if (test()) {
  72. return emitter().then(() => {
  73. return continueWhile(test, emitter);
  74. });
  75. }
  76. return Promise.resolve();
  77. }