@@ -52,7 +52,7 @@ const {
52
52
clearAsyncIdStack,
53
53
} = async_wrap ;
54
54
// For performance reasons, only track Promises when a hook is enabled.
55
- const { enablePromiseHook , disablePromiseHook , setPromiseHooks } = async_wrap ;
55
+ const { setPromiseHooks } = async_wrap ;
56
56
// Properties in active_hooks are used to keep track of the set of hooks being
57
57
// executed in case another hook is enabled/disabled. The new set of hooks is
58
58
// then restored once the active set of hooks is finished executing.
@@ -307,9 +307,13 @@ function trackPromise(promise, parent) {
307
307
return ;
308
308
}
309
309
310
- promise [ async_id_symbol ] = newAsyncId ( ) ;
311
- promise [ trigger_async_id_symbol ] = parent ? getOrSetAsyncId ( parent ) :
310
+ // Get trigger id from parent async id before making the async id of the
311
+ // child so if a new one must be made it will be lower than the child.
312
+ const triggerAsyncId = parent ? getOrSetAsyncId ( parent ) :
312
313
getDefaultTriggerAsyncId ( ) ;
314
+
315
+ promise [ async_id_symbol ] = newAsyncId ( ) ;
316
+ promise [ trigger_async_id_symbol ] = triggerAsyncId ;
313
317
}
314
318
315
319
function promiseInitHook ( promise , parent ) {
@@ -319,6 +323,21 @@ function promiseInitHook(promise, parent) {
319
323
emitInitScript ( asyncId , 'PROMISE' , triggerAsyncId , promise ) ;
320
324
}
321
325
326
+ function promiseInitHookWithDestroyTracking ( promise , parent ) {
327
+ promiseInitHook ( promise , parent ) ;
328
+ destroyTracking ( promise , parent ) ;
329
+ }
330
+
331
+ const destroyedSymbol = Symbol ( 'destroyed' ) ;
332
+
333
+ function destroyTracking ( promise , parent ) {
334
+ trackPromise ( promise , parent ) ;
335
+ const asyncId = promise [ async_id_symbol ] ;
336
+ const destroyed = { destroyed : false } ;
337
+ promise [ destroyedSymbol ] = destroyed ;
338
+ registerDestroyHook ( promise , asyncId , destroyed ) ;
339
+ }
340
+
322
341
function promiseBeforeHook ( promise ) {
323
342
trackPromise ( promise ) ;
324
343
const asyncId = promise [ async_id_symbol ] ;
@@ -355,18 +374,19 @@ function enableHooks() {
355
374
356
375
function updatePromiseHookMode ( ) {
357
376
wantPromiseHook = true ;
358
- if ( destroyHooksExist ( ) ) {
359
- enablePromiseHook ( ) ;
360
- setPromiseHooks ( undefined , undefined , undefined , undefined ) ;
361
- } else {
362
- disablePromiseHook ( ) ;
363
- setPromiseHooks (
364
- initHooksExist ( ) ? promiseInitHook : undefined ,
365
- promiseBeforeHook ,
366
- promiseAfterHook ,
367
- promiseResolveHooksExist ( ) ? promiseResolveHook : undefined ,
368
- ) ;
377
+ let initHook ;
378
+ if ( initHooksExist ( ) ) {
379
+ initHook = destroyHooksExist ( ) ? promiseInitHookWithDestroyTracking :
380
+ promiseInitHook ;
381
+ } else if ( destroyHooksExist ( ) ) {
382
+ initHook = destroyTracking ;
369
383
}
384
+ setPromiseHooks (
385
+ initHook ,
386
+ promiseBeforeHook ,
387
+ promiseAfterHook ,
388
+ promiseResolveHooksExist ( ) ? promiseResolveHook : undefined ,
389
+ ) ;
370
390
}
371
391
372
392
function disableHooks ( ) {
@@ -381,7 +401,6 @@ function disableHooks() {
381
401
382
402
function disablePromiseHookIfNecessary ( ) {
383
403
if ( ! wantPromiseHook ) {
384
- disablePromiseHook ( ) ;
385
404
setPromiseHooks ( undefined , undefined , undefined , undefined ) ;
386
405
}
387
406
}
0 commit comments