From 3818436ebc649267bb39b976b6b567b7f2b06a64 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 1 May 2024 10:19:43 +0200 Subject: [PATCH] fix(core): don't schedule timer triggers on the server (#55605) Fixes that even though we weren't rendering the deferred block the server, we were still triggering the timeout which can delay the response. Fixes #55475. PR Close #55605 --- packages/core/src/defer/instructions.ts | 32 ++++++++++++++++--------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/core/src/defer/instructions.ts b/packages/core/src/defer/instructions.ts index e1d7d05e1c1..241cff62670 100644 --- a/packages/core/src/defer/instructions.ts +++ b/packages/core/src/defer/instructions.ts @@ -424,9 +424,14 @@ function scheduleDelayedTrigger( const tNode = getCurrentTNode()!; renderPlaceholder(lView, tNode); - const cleanupFn = scheduleFn(() => triggerDeferBlock(lView, tNode), lView); - const lDetails = getLDeferBlockDetails(lView, tNode); - storeTriggerCleanupFn(TriggerType.Regular, lDetails, cleanupFn); + + // Only trigger the scheduled trigger on the browser + // since we don't want to delay the server response. + if (isPlatformBrowser(lView[INJECTOR]!)) { + const cleanupFn = scheduleFn(() => triggerDeferBlock(lView, tNode), lView); + const lDetails = getLDeferBlockDetails(lView, tNode); + storeTriggerCleanupFn(TriggerType.Regular, lDetails, cleanupFn); + } } /** @@ -437,15 +442,20 @@ function scheduleDelayedTrigger( function scheduleDelayedPrefetching( scheduleFn: (callback: VoidFunction, lView: LView) => VoidFunction) { const lView = getLView(); - const tNode = getCurrentTNode()!; - const tView = lView[TVIEW]; - const tDetails = getTDeferBlockDetails(tView, tNode); - if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { - const lDetails = getLDeferBlockDetails(lView, tNode); - const prefetch = () => triggerPrefetching(tDetails, lView, tNode); - const cleanupFn = scheduleFn(prefetch, lView); - storeTriggerCleanupFn(TriggerType.Prefetch, lDetails, cleanupFn); + // Only trigger the scheduled trigger on the browser + // since we don't want to delay the server response. + if (isPlatformBrowser(lView[INJECTOR]!)) { + const tNode = getCurrentTNode()!; + const tView = lView[TVIEW]; + const tDetails = getTDeferBlockDetails(tView, tNode); + + if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { + const lDetails = getLDeferBlockDetails(lView, tNode); + const prefetch = () => triggerPrefetching(tDetails, lView, tNode); + const cleanupFn = scheduleFn(prefetch, lView); + storeTriggerCleanupFn(TriggerType.Prefetch, lDetails, cleanupFn); + } } }