promiseUtils.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. promise.resolve = res;
  17. promise.reject = rej;
  18. return promise;
  19. }
  20. function when(promises) {
  21. let objects;
  22. const arrayArgument = Array.isArray(promises);
  23. if (arrayArgument) {
  24. objects = promises;
  25. } else {
  26. objects = arguments;
  27. }
  28. let total = objects.length;
  29. let hadError = false;
  30. const results = [];
  31. const returnValue = arrayArgument ? [results] : results;
  32. const errors = [];
  33. results.length = objects.length;
  34. errors.length = objects.length;
  35. if (total === 0) {
  36. return Promise.resolve(returnValue);
  37. }
  38. const promise = new resolvingPromise();
  39. const resolveOne = function () {
  40. total--;
  41. if (total <= 0) {
  42. if (hadError) {
  43. promise.reject(errors);
  44. } else {
  45. promise.resolve(returnValue);
  46. }
  47. }
  48. };
  49. const chain = function (object, index) {
  50. if (object && typeof object.then === 'function') {
  51. object.then(function (result) {
  52. results[index] = result;
  53. resolveOne();
  54. }, function (error) {
  55. errors[index] = error;
  56. hadError = true;
  57. resolveOne();
  58. });
  59. } else {
  60. results[index] = object;
  61. resolveOne();
  62. }
  63. };
  64. for (let i = 0; i < objects.length; i++) {
  65. chain(objects[i], i);
  66. }
  67. return promise;
  68. }
  69. function continueWhile(test, emitter) {
  70. if (test()) {
  71. return emitter().then(() => {
  72. return continueWhile(test, emitter);
  73. });
  74. }
  75. return Promise.resolve();
  76. }