Переглянути джерело

Fix bug with promise when value is returned instead of promise

David Catuhe 7 роки тому
батько
коміт
1dc021bd61

Різницю між файлами не показано, бо вона завелика
+ 6419 - 6419
Playground/babylon.d.txt


Різницю між файлами не показано, бо вона завелика
+ 7004 - 7004
dist/preview release/babylon.d.ts


Різницю між файлами не показано, бо вона завелика
+ 22 - 22
dist/preview release/babylon.js


+ 11 - 4
dist/preview release/babylon.max.js

@@ -8346,10 +8346,16 @@ var BABYLON;
             this._child = newPromise;
             if (this._state !== PromiseStates.Pending) {
                 if (this._state === PromiseStates.Fulfilled || this._rejectWasConsumed) {
-                    var returnedPromise = newPromise._resolve(this._result);
-                    if (returnedPromise) {
-                        newPromise._child = returnedPromise;
-                        newPromise = returnedPromise;
+                    var returnedValue = newPromise._resolve(this._result);
+                    if (returnedValue !== undefined && returnedValue !== null) {
+                        if (returnedValue._state !== undefined) {
+                            var returnedPromise = returnedValue;
+                            newPromise._child = returnedPromise;
+                            newPromise = returnedPromise;
+                        }
+                        else {
+                            newPromise._result = returnedValue;
+                        }
                     }
                 }
                 else {
@@ -44531,6 +44537,7 @@ var BABYLON;
             }
             if (this._localDelayOffset === null) {
                 this._localDelayOffset = delay;
+                this._pausedDelay = null;
             }
             else if (this._pausedDelay !== null) {
                 this._localDelayOffset += delay - this._pausedDelay;

Різницю між файлами не показано, бо вона завелика
+ 22 - 22
dist/preview release/babylon.worker.js


Різницю між файлами не показано, бо вона завелика
+ 2920 - 2920
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts


Різницю між файлами не показано, бо вона завелика
+ 22 - 22
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


+ 11 - 4
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js

@@ -8346,10 +8346,16 @@ var BABYLON;
             this._child = newPromise;
             if (this._state !== PromiseStates.Pending) {
                 if (this._state === PromiseStates.Fulfilled || this._rejectWasConsumed) {
-                    var returnedPromise = newPromise._resolve(this._result);
-                    if (returnedPromise) {
-                        newPromise._child = returnedPromise;
-                        newPromise = returnedPromise;
+                    var returnedValue = newPromise._resolve(this._result);
+                    if (returnedValue !== undefined && returnedValue !== null) {
+                        if (returnedValue._state !== undefined) {
+                            var returnedPromise = returnedValue;
+                            newPromise._child = returnedPromise;
+                            newPromise = returnedPromise;
+                        }
+                        else {
+                            newPromise._result = returnedValue;
+                        }
                     }
                 }
                 else {
@@ -44531,6 +44537,7 @@ var BABYLON;
             }
             if (this._localDelayOffset === null) {
                 this._localDelayOffset = delay;
+                this._pausedDelay = null;
             }
             else if (this._pausedDelay !== null) {
                 this._localDelayOffset += delay - this._pausedDelay;

+ 11 - 4
dist/preview release/customConfigurations/minimalGLTFViewer/es6.js

@@ -8332,10 +8332,16 @@ var BABYLON;
             this._child = newPromise;
             if (this._state !== PromiseStates.Pending) {
                 if (this._state === PromiseStates.Fulfilled || this._rejectWasConsumed) {
-                    var returnedPromise = newPromise._resolve(this._result);
-                    if (returnedPromise) {
-                        newPromise._child = returnedPromise;
-                        newPromise = returnedPromise;
+                    var returnedValue = newPromise._resolve(this._result);
+                    if (returnedValue !== undefined && returnedValue !== null) {
+                        if (returnedValue._state !== undefined) {
+                            var returnedPromise = returnedValue;
+                            newPromise._child = returnedPromise;
+                            newPromise = returnedPromise;
+                        }
+                        else {
+                            newPromise._result = returnedValue;
+                        }
                     }
                 }
                 else {
@@ -44517,6 +44523,7 @@ var BABYLON;
             }
             if (this._localDelayOffset === null) {
                 this._localDelayOffset = delay;
+                this._pausedDelay = null;
             }
             else if (this._pausedDelay !== null) {
                 this._localDelayOffset += delay - this._pausedDelay;

+ 11 - 4
dist/preview release/es6.js

@@ -8332,10 +8332,16 @@ var BABYLON;
             this._child = newPromise;
             if (this._state !== PromiseStates.Pending) {
                 if (this._state === PromiseStates.Fulfilled || this._rejectWasConsumed) {
-                    var returnedPromise = newPromise._resolve(this._result);
-                    if (returnedPromise) {
-                        newPromise._child = returnedPromise;
-                        newPromise = returnedPromise;
+                    var returnedValue = newPromise._resolve(this._result);
+                    if (returnedValue !== undefined && returnedValue !== null) {
+                        if (returnedValue._state !== undefined) {
+                            var returnedPromise = returnedValue;
+                            newPromise._child = returnedPromise;
+                            newPromise = returnedPromise;
+                        }
+                        else {
+                            newPromise._result = returnedValue;
+                        }
                     }
                 }
                 else {
@@ -44517,6 +44523,7 @@ var BABYLON;
             }
             if (this._localDelayOffset === null) {
                 this._localDelayOffset = delay;
+                this._pausedDelay = null;
             }
             else if (this._pausedDelay !== null) {
                 this._localDelayOffset += delay - this._pausedDelay;

Різницю між файлами не показано, бо вона завелика
+ 12 - 12
dist/preview release/viewer/babylon.viewer.js


+ 1 - 0
src/Animations/babylon.animatable.ts

@@ -192,6 +192,7 @@
 
             if (this._localDelayOffset === null) {
                 this._localDelayOffset = delay;
+                this._pausedDelay = null;
             } else if (this._pausedDelay !== null) {
                 this._localDelayOffset += delay - this._pausedDelay;
                 this._pausedDelay = null;

+ 14 - 9
src/Tools/babylon.promise.ts

@@ -18,7 +18,7 @@ module BABYLON {
         private _result?: Nullable<T>;
         private _reason: any;
         private _child: InternalPromise<T>;
-        private _onFulfilled?: (fulfillment?: Nullable<T>) => Nullable<InternalPromise<T>>;
+        private _onFulfilled?: (fulfillment?: Nullable<T>) => Nullable<InternalPromise<T>> | T;
         private _onRejected?: (reason: any) => void;
         private _rejectWasConsumed = false;
 
@@ -76,7 +76,7 @@ module BABYLON {
             return this.then(undefined, onRejected);
         }
 
-        public then(onFulfilled?: (fulfillment?: Nullable<T>) => Nullable<InternalPromise<T>>, onRejected?: (reason: any) => void): InternalPromise<T> {
+        public then(onFulfilled?: (fulfillment?: Nullable<T>) => Nullable<InternalPromise<T>> | T, onRejected?: (reason: any) => void): InternalPromise<T> {
             let newPromise = new InternalPromise<T>();
             newPromise._onFulfilled = onFulfilled;
             newPromise._onRejected = onRejected;
@@ -86,11 +86,16 @@ module BABYLON {
 
             if (this._state !== PromiseStates.Pending) {
                 if (this._state === PromiseStates.Fulfilled || this._rejectWasConsumed) {
-                    let returnedPromise = newPromise._resolve(this._result);
-
-                    if (returnedPromise) {
-                        newPromise._child = returnedPromise;
-                        newPromise = returnedPromise;
+                    let returnedValue = newPromise._resolve(this._result);
+
+                    if (returnedValue !== undefined && returnedValue !== null) {
+                        if ((<InternalPromise<T>>returnedValue)._state !== undefined) {
+                            let returnedPromise = returnedValue as InternalPromise<T>;
+                            newPromise._child = returnedPromise;
+                            newPromise = returnedPromise;
+                        } else {
+                            newPromise._result = (<T>returnedValue);
+                        }
                     }
                 } else {
                     newPromise._reject(this._reason);
@@ -100,11 +105,11 @@ module BABYLON {
             return newPromise;
         }       
         
-        private _resolve(value?: Nullable<T>): Nullable<InternalPromise<T>> {
+        private _resolve(value?: Nullable<T>): Nullable<InternalPromise<T>> | T {
             try {
                 this._state = PromiseStates.Fulfilled;
                 this._result = value;
-                let returnedPromise: Nullable<InternalPromise<T>> = null;
+                let returnedPromise: Nullable<InternalPromise<T>> | T = null;
 
                 if (this._onFulfilled) {
                     returnedPromise = this._onFulfilled(value);

+ 13 - 0
tests/unit/babylon/promises/babylon.promises.tests.ts

@@ -137,4 +137,17 @@ describe('Babylon.Promise', () => {
             });
         });
     });   
+
+    describe('#Returning value', () => {
+        it('should correctly handle returned values', (done) => {
+            mocha.timeout(10000);
+            Promise.resolve(1)
+            .then(number => { return number + 1; })
+            .then(number => { return number + 1; })
+            .then(number => { 
+                number.should.be.equal(3);
+                done();
+             })
+        });
+    });      
 });