IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 line
1.9KB

  1. const defaultOrderRegistry = {};
  2. function wbApplyPromiseOrdering(prom, orderRegistry) {
  3. let orderId;
  4. if (!orderRegistry)
  5. orderRegistry = defaultOrderRegistry;
  6. if (Object.keys(orderRegistry).length === 0) {
  7. orderRegistry.started = 0;
  8. orderRegistry.pendingCompletion = {};
  9. orderRegistry.completed = { 0: true };
  10. }
  11. orderRegistry.started += 1;
  12. orderId = orderRegistry.started;
  13. // console.log('New orderId: ' + orderId);
  14. const orderCallback = ((isCatch, payload) => {
  15. // console.log('orderId: ' + orderId +
  16. // ', pendingCompletion: ' + Object.keys(orderRegistry.pendingCompletion) +
  17. // ', completed: ' + Object.keys(orderRegistry.completed));
  18. if ((orderId - 1) in orderRegistry.completed) {
  19. // console.log('Running: ' + orderId);
  20. orderRegistry.completed[orderId] = true;
  21. delete orderRegistry.pendingCompletion[orderId];
  22. const keys = Object.keys(orderRegistry.pendingCompletion);
  23. keys.sort((a, b) => (a - b));
  24. keys.map(k => {
  25. if ((k - 1) in orderRegistry.completed) {
  26. // console.log('Running: ' + k);
  27. orderRegistry.pendingCompletion[k]();
  28. orderRegistry.completed[k] = true;
  29. delete orderRegistry.pendingCompletion[k];
  30. }
  31. });
  32. if (orderRegistry.started in orderRegistry.completed) {
  33. // console.log('Garbage collect');
  34. orderRegistry.started = 0;
  35. orderRegistry.completed = { 0: true };
  36. }
  37. if (isCatch)
  38. throw payload;
  39. else
  40. return payload;
  41. }
  42. const prom_1 = new Promise((accept, reject) => {
  43. orderRegistry.pendingCompletion[orderId] = (() =>
  44. (isCatch ? reject(payload) : accept(payload)));
  45. });
  46. return prom_1;
  47. });
  48. prom = prom.then(xhr => orderCallback(false, xhr));
  49. prom = prom.catch(e => orderCallback(true, e));
  50. return prom;
  51. }
  52. export default wbApplyPromiseOrdering;