@@ -307,6 +307,9 @@ interface ZoneType {
307
307
308
308
/** @internal */
309
309
__symbol__ ( name : string ) : string ;
310
+
311
+ /** @internal */
312
+ setAsyncFrame ( ) : void ;
310
313
}
311
314
312
315
/** @internal */
@@ -661,6 +664,9 @@ const Zone: ZoneType = (function(global: any) {
661
664
}
662
665
}
663
666
667
+ const detectAsyncFunction = async function ( ) { } ;
668
+ const AsyncFunction = detectAsyncFunction . constructor ;
669
+
664
670
class Zone implements AmbientZone {
665
671
static __symbol__ : ( name : string ) => string = __symbol__ ;
666
672
@@ -691,6 +697,10 @@ const Zone: ZoneType = (function(global: any) {
691
697
return _currentTask ;
692
698
}
693
699
700
+ static setAsyncFrame ( ) {
701
+ _currentZoneFrame = _asyncZoneFrame ! ;
702
+ }
703
+
694
704
static __load_patch ( name : string , fn : _PatchFn ) : void {
695
705
if ( patches . hasOwnProperty ( name ) ) {
696
706
throw Error ( 'Already loaded patch: ' + name ) ;
@@ -761,9 +771,26 @@ const Zone: ZoneType = (function(global: any) {
761
771
callback : ( ...args : any [ ] ) => T , applyThis ?: any , applyArgs ?: any [ ] , source ?: string ) : T {
762
772
_currentZoneFrame = { parent : _currentZoneFrame , zone : this } ;
763
773
try {
774
+ if ( callback && callback . constructor === AsyncFunction ) {
775
+ const r = this . _zoneDelegate . invoke ( this , callback , applyThis , applyArgs , source ) ;
776
+ if ( r && typeof r . then === 'function' ) {
777
+ _asyncZoneFrame = _currentZoneFrame ;
778
+ return r . then ( ( result : any ) => {
779
+ _currentZoneFrame = _asyncZoneFrame ! . parent ! ;
780
+ _isAsyncSet = true ;
781
+ _asyncZoneFrame = null ;
782
+ return result ;
783
+ } ) ;
784
+ }
785
+ return r ;
786
+ }
764
787
return this . _zoneDelegate . invoke ( this , callback , applyThis , applyArgs , source ) ;
765
788
} finally {
766
- _currentZoneFrame = _currentZoneFrame . parent ! ;
789
+ if ( ! _isAsyncSet ) {
790
+ _currentZoneFrame = _currentZoneFrame . parent ! ;
791
+ } else {
792
+ _isAsyncSet = false ;
793
+ }
767
794
}
768
795
}
769
796
@@ -1353,6 +1380,8 @@ const Zone: ZoneType = (function(global: any) {
1353
1380
} ,
1354
1381
} ;
1355
1382
let _currentZoneFrame : _ZoneFrame = { parent : null , zone : new Zone ( null , null ) } ;
1383
+ let _asyncZoneFrame : _ZoneFrame | null = null ;
1384
+ let _isAsyncSet = false ;
1356
1385
let _currentTask : Task | null = null ;
1357
1386
let _numberOfNestedTaskFrames = 0 ;
1358
1387
0 commit comments