promiseUtils.js 1.7 KB

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