Browse Source

Extending the observable class with Promise-enabled notification

Raanan Weber 7 năm trước cách đây
mục cha
commit
4b6a22b37d
1 tập tin đã thay đổi với 38 bổ sung0 xóa
  1. 38 0
      Viewer/src/util/promiseObservable.ts

+ 38 - 0
Viewer/src/util/promiseObservable.ts

@@ -0,0 +1,38 @@
+import { Observable, Nullable, Observer } from "babylonjs";
+
+export class PromiseObservable<T> extends Observable<T> {
+
+    public notifyWithPromise(eventData: T, mask: number = -1, target?: any, currentTarget?: any): Promise<any> {
+
+        let p = Promise.resolve();
+
+        if (!this._observers.length) {
+            return p;
+        }
+
+        let state = this['_eventState'];
+        state.mask = mask;
+        state.target = target;
+        state.currentTarget = currentTarget;
+        state.skipNextObservers = false;
+
+        for (var obs of this._observers) {
+            if (obs.mask & mask) {
+                if (obs.scope) {
+                    // TODO - I can add the variable from the last function here. Requires changing callback sig
+                    p = p.then(() => {
+                        return obs.callback.apply(obs.scope, [eventData, state]);
+                    });
+                } else {
+                    p = p.then(() => {
+                        return obs.callback(eventData, state);
+                    });
+                }
+            }
+            if (state.skipNextObservers) {
+                return p;
+            }
+        }
+        return p;
+    }
+}