Sfoglia il codice sorgente

TIny fix for observables

David Catuhe 7 anni fa
parent
commit
0e488ae512

File diff suppressed because it is too large
+ 2183 - 2181
Playground/babylon.d.txt


File diff suppressed because it is too large
+ 11 - 11
Viewer/dist/viewer.js


File diff suppressed because it is too large
+ 11 - 11
Viewer/dist/viewer.min.js


File diff suppressed because it is too large
+ 2109 - 2107
dist/preview release/babylon.d.ts


File diff suppressed because it is too large
+ 11 - 11
dist/preview release/babylon.js


+ 9 - 0
dist/preview release/babylon.max.js

@@ -7212,6 +7212,8 @@ var BABYLON;
             this.callback = callback;
             this.mask = mask;
             this.scope = scope;
+            /** @ignore */
+            this._willBeUnregistered = false;
             /**
              * Gets or sets a property defining that the observer as to be unregistered after the next notification
              */
@@ -7347,6 +7349,7 @@ var BABYLON;
         Observable.prototype._deferUnregister = function (observer) {
             var _this = this;
             observer.unregisterOnNextCall = false;
+            observer._willBeUnregistered = true;
             BABYLON.Tools.SetImmediate(function () {
                 _this.remove(observer);
             });
@@ -7373,6 +7376,9 @@ var BABYLON;
             state.lastReturnValue = eventData;
             for (var _i = 0, _a = this._observers; _i < _a.length; _i++) {
                 var obs = _a[_i];
+                if (obs._willBeUnregistered) {
+                    continue;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);
@@ -7422,6 +7428,9 @@ var BABYLON;
                 if (state.skipNextObservers) {
                     return;
                 }
+                if (obs._willBeUnregistered) {
+                    return;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         p = p.then(function (lastReturnedValue) {

File diff suppressed because it is too large
+ 11 - 11
dist/preview release/babylon.worker.js


File diff suppressed because it is too large
+ 3607 - 3605
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts


File diff suppressed because it is too large
+ 11 - 11
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


+ 9 - 0
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js

@@ -7212,6 +7212,8 @@ var BABYLON;
             this.callback = callback;
             this.mask = mask;
             this.scope = scope;
+            /** @ignore */
+            this._willBeUnregistered = false;
             /**
              * Gets or sets a property defining that the observer as to be unregistered after the next notification
              */
@@ -7347,6 +7349,7 @@ var BABYLON;
         Observable.prototype._deferUnregister = function (observer) {
             var _this = this;
             observer.unregisterOnNextCall = false;
+            observer._willBeUnregistered = true;
             BABYLON.Tools.SetImmediate(function () {
                 _this.remove(observer);
             });
@@ -7373,6 +7376,9 @@ var BABYLON;
             state.lastReturnValue = eventData;
             for (var _i = 0, _a = this._observers; _i < _a.length; _i++) {
                 var obs = _a[_i];
+                if (obs._willBeUnregistered) {
+                    continue;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);
@@ -7422,6 +7428,9 @@ var BABYLON;
                 if (state.skipNextObservers) {
                     return;
                 }
+                if (obs._willBeUnregistered) {
+                    return;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         p = p.then(function (lastReturnedValue) {

+ 9 - 0
dist/preview release/customConfigurations/minimalGLTFViewer/es6.js

@@ -7198,6 +7198,8 @@ var BABYLON;
             this.callback = callback;
             this.mask = mask;
             this.scope = scope;
+            /** @ignore */
+            this._willBeUnregistered = false;
             /**
              * Gets or sets a property defining that the observer as to be unregistered after the next notification
              */
@@ -7333,6 +7335,7 @@ var BABYLON;
         Observable.prototype._deferUnregister = function (observer) {
             var _this = this;
             observer.unregisterOnNextCall = false;
+            observer._willBeUnregistered = true;
             BABYLON.Tools.SetImmediate(function () {
                 _this.remove(observer);
             });
@@ -7359,6 +7362,9 @@ var BABYLON;
             state.lastReturnValue = eventData;
             for (var _i = 0, _a = this._observers; _i < _a.length; _i++) {
                 var obs = _a[_i];
+                if (obs._willBeUnregistered) {
+                    continue;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);
@@ -7408,6 +7414,9 @@ var BABYLON;
                 if (state.skipNextObservers) {
                     return;
                 }
+                if (obs._willBeUnregistered) {
+                    return;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         p = p.then(function (lastReturnedValue) {

+ 9 - 0
dist/preview release/es6.js

@@ -7198,6 +7198,8 @@ var BABYLON;
             this.callback = callback;
             this.mask = mask;
             this.scope = scope;
+            /** @ignore */
+            this._willBeUnregistered = false;
             /**
              * Gets or sets a property defining that the observer as to be unregistered after the next notification
              */
@@ -7333,6 +7335,7 @@ var BABYLON;
         Observable.prototype._deferUnregister = function (observer) {
             var _this = this;
             observer.unregisterOnNextCall = false;
+            observer._willBeUnregistered = true;
             BABYLON.Tools.SetImmediate(function () {
                 _this.remove(observer);
             });
@@ -7359,6 +7362,9 @@ var BABYLON;
             state.lastReturnValue = eventData;
             for (var _i = 0, _a = this._observers; _i < _a.length; _i++) {
                 var obs = _a[_i];
+                if (obs._willBeUnregistered) {
+                    continue;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);
@@ -7408,6 +7414,9 @@ var BABYLON;
                 if (state.skipNextObservers) {
                     return;
                 }
+                if (obs._willBeUnregistered) {
+                    return;
+                }
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         p = p.then(function (lastReturnedValue) {

File diff suppressed because it is too large
+ 11 - 11
dist/preview release/viewer/babylon.viewer.js


+ 10 - 0
src/Tools/babylon.observable.ts

@@ -63,6 +63,8 @@
      * Represent an Observer registered to a given Observable object.
      */
     export class Observer<T> {
+        /** @ignore */
+        public _willBeUnregistered = false;
         /**
          * Gets or sets a property defining that the observer as to be unregistered after the next notification
          */
@@ -234,6 +236,7 @@
 
         private _deferUnregister(observer: Observer<T>): void {
             observer.unregisterOnNextCall = false;
+            observer._willBeUnregistered = true;
             Tools.SetImmediate(() => {
                 this.remove(observer);
             })
@@ -261,6 +264,10 @@
             state.lastReturnValue = eventData;
 
             for (var obs of this._observers) {
+                if (obs._willBeUnregistered) {
+                    continue;
+                }
+
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state])
@@ -313,6 +320,9 @@
                 if (state.skipNextObservers) {
                     return;
                 }
+                if (obs._willBeUnregistered) {
+                    return;
+                }                
                 if (obs.mask & mask) {
                     if (obs.scope) {
                         p = p.then((lastReturnedValue) => {