observable.extensions.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { Observable } from "./observable.js";
  2. /**
  3. * Represent a list of observers registered to multiple Observables object.
  4. */
  5. export class MultiObserver {
  6. /**
  7. * Release associated resources
  8. */
  9. dispose() {
  10. if (this._observers && this._observables) {
  11. for (let index = 0; index < this._observers.length; index++) {
  12. this._observables[index].remove(this._observers[index]);
  13. }
  14. }
  15. this._observers = null;
  16. this._observables = null;
  17. }
  18. /**
  19. * Raise a callback when one of the observable will notify
  20. * @param observables defines a list of observables to watch
  21. * @param callback defines the callback to call on notification
  22. * @param mask defines the mask used to filter notifications
  23. * @param scope defines the current scope used to restore the JS context
  24. * @returns the new MultiObserver
  25. */
  26. static Watch(observables, callback, mask = -1, scope = null) {
  27. const result = new MultiObserver();
  28. result._observers = new Array();
  29. result._observables = observables;
  30. for (const observable of observables) {
  31. const observer = observable.add(callback, mask, false, scope);
  32. if (observer) {
  33. result._observers.push(observer);
  34. }
  35. }
  36. return result;
  37. }
  38. }
  39. Observable.prototype.notifyObserversWithPromise = async function (eventData, mask = -1, target, currentTarget, userInfo) {
  40. // create an empty promise
  41. let p = Promise.resolve(eventData);
  42. // no observers? return this promise.
  43. if (!this.observers.length) {
  44. return p;
  45. }
  46. const state = this._eventState;
  47. state.mask = mask;
  48. state.target = target;
  49. state.currentTarget = currentTarget;
  50. state.skipNextObservers = false;
  51. state.userInfo = userInfo;
  52. // execute one callback after another (not using Promise.all, the order is important)
  53. this.observers.forEach((obs) => {
  54. if (state.skipNextObservers) {
  55. return;
  56. }
  57. if (obs._willBeUnregistered) {
  58. return;
  59. }
  60. if (obs.mask & mask) {
  61. if (obs.scope) {
  62. p = p.then((lastReturnedValue) => {
  63. state.lastReturnValue = lastReturnedValue;
  64. return obs.callback.apply(obs.scope, [eventData, state]);
  65. });
  66. }
  67. else {
  68. p = p.then((lastReturnedValue) => {
  69. state.lastReturnValue = lastReturnedValue;
  70. return obs.callback(eventData, state);
  71. });
  72. }
  73. if (obs.unregisterOnNextCall) {
  74. this._deferUnregister(obs);
  75. }
  76. }
  77. });
  78. // return the eventData
  79. await p;
  80. return eventData;
  81. };
  82. //# sourceMappingURL=observable.extensions.js.map