promiseUtils.js 1.6 KB

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