Skip to content

Commit

Permalink
refactor(core): Update defer scheduler to use injector (angular#58195)
Browse files Browse the repository at this point in the history
This updates the functions for defer scheduler triggers to use a passed in injector instead of an lview.

PR Close angular#58195
  • Loading branch information
thePunderWoman authored and AndrewKushnir committed Oct 14, 2024
1 parent 517da95 commit d6a8d35
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 18 deletions.
8 changes: 3 additions & 5 deletions packages/core/src/defer/idle_scheduler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,16 @@
* found in the LICENSE file at https://angular.dev/license
*/

import {inject, ɵɵdefineInjectable} from '../di';
import {INJECTOR, LView} from '../render3/interfaces/view';
import {Injector, inject, ɵɵdefineInjectable} from '../di';
import {NgZone} from '../zone';

/**
* Helper function to schedule a callback to be invoked when a browser becomes idle.
*
* @param callback A function to be invoked when a browser becomes idle.
* @param lView LView that hosts an instance of a defer block.
* @param injector injector for the app
*/
export function onIdle(callback: VoidFunction, lView: LView) {
const injector = lView[INJECTOR]!;
export function onIdle(callback: VoidFunction, injector: Injector) {
const scheduler = injector.get(IdleScheduler);
const cleanupFn = () => scheduler.remove(callback);
scheduler.add(callback);
Expand Down
16 changes: 9 additions & 7 deletions packages/core/src/defer/instructions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -526,17 +526,18 @@ export function ɵɵdeferHydrateOnViewport(): void {}
* Schedules triggering of a defer block for `on idle` and `on timer` conditions.
*/
function scheduleDelayedTrigger(
scheduleFn: (callback: VoidFunction, lView: LView) => VoidFunction,
scheduleFn: (callback: VoidFunction, injector: Injector) => VoidFunction,
) {
const lView = getLView();
const tNode = getCurrentTNode()!;
const injector = lView[INJECTOR]!;

renderPlaceholder(lView, tNode);

// 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);
if (isPlatformBrowser(injector)) {
const cleanupFn = scheduleFn(() => triggerDeferBlock(lView, tNode), injector);
const lDetails = getLDeferBlockDetails(lView, tNode);
storeTriggerCleanupFn(TriggerType.Regular, lDetails, cleanupFn);
}
Expand All @@ -548,21 +549,22 @@ function scheduleDelayedTrigger(
* @param scheduleFn A function that does the scheduling.
*/
function scheduleDelayedPrefetching(
scheduleFn: (callback: VoidFunction, lView: LView) => VoidFunction,
scheduleFn: (callback: VoidFunction, injector: Injector) => VoidFunction,
) {
const lView = getLView();
const injector = lView[INJECTOR]!;

// Only trigger the scheduled trigger on the browser
// since we don't want to delay the server response.
if (isPlatformBrowser(lView[INJECTOR]!)) {
if (isPlatformBrowser(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);
const cleanupFn = scheduleFn(prefetch, injector);
storeTriggerCleanupFn(TriggerType.Prefetch, lDetails, cleanupFn);
}
}
Expand Down Expand Up @@ -835,7 +837,7 @@ function scheduleDeferBlockUpdate(
renderDeferBlockState(nextState, tNode, lContainer);
}
};
return scheduleTimerTrigger(timeout, callback, hostLView);
return scheduleTimerTrigger(timeout, callback, hostLView[INJECTOR]!);
}

/**
Expand Down
11 changes: 5 additions & 6 deletions packages/core/src/defer/timer_scheduler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,26 @@
* found in the LICENSE file at https://angular.dev/license
*/

import {ɵɵdefineInjectable} from '../di';
import {INJECTOR, LView} from '../render3/interfaces/view';
import {Injector, ɵɵdefineInjectable} from '../di';
import {arrayInsert2, arraySplice} from '../util/array_utils';

/**
* Returns a function that captures a provided delay.
* Invoking the returned function schedules a trigger.
*/
export function onTimer(delay: number) {
return (callback: VoidFunction, lView: LView) => scheduleTimerTrigger(delay, callback, lView);
return (callback: VoidFunction, injector: Injector) =>
scheduleTimerTrigger(delay, callback, injector);
}

/**
* Schedules a callback to be invoked after a given timeout.
*
* @param delay A number of ms to wait until firing a callback.
* @param callback A function to be invoked after a timeout.
* @param lView LView that hosts an instance of a defer block.
* @param injector injector for the app.
*/
export function scheduleTimerTrigger(delay: number, callback: VoidFunction, lView: LView) {
const injector = lView[INJECTOR]!;
export function scheduleTimerTrigger(delay: number, callback: VoidFunction, injector: Injector) {
const scheduler = injector.get(TimerScheduler);
const cleanupFn = () => scheduler.remove(callback);
scheduler.add(delay, callback);
Expand Down

0 comments on commit d6a8d35

Please sign in to comment.