feat: performance improvement for eventListeners (#34613)
PR Close #34613
This commit is contained in:
parent
4d36b2f6e9
commit
a3c7ab99b7
|
@ -44,6 +44,16 @@ export const globalSources: any = {};
|
|||
const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
|
||||
const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
|
||||
|
||||
function prepareEventNames(eventName: string, eventNameToString?: (eventName: string) => string) {
|
||||
const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
|
||||
const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
|
||||
const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
|
||||
const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
|
||||
zoneSymbolEventNames[eventName] = {};
|
||||
zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
|
||||
zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
|
||||
}
|
||||
|
||||
export interface PatchEventTargetOptions {
|
||||
// validateHandler
|
||||
vh?: (nativeDelegate: any, delegate: any, target: any, args: any) => boolean;
|
||||
|
@ -387,23 +397,12 @@ export function patchEventTarget(
|
|||
}
|
||||
|
||||
const zone = Zone.current;
|
||||
const symbolEventNames = zoneSymbolEventNames[eventName];
|
||||
let symbolEventName;
|
||||
let symbolEventNames = zoneSymbolEventNames[eventName];
|
||||
if (!symbolEventNames) {
|
||||
// the code is duplicate, but I just want to get some better performance
|
||||
const falseEventName =
|
||||
(eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
|
||||
const trueEventName =
|
||||
(eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
|
||||
const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
|
||||
const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
|
||||
zoneSymbolEventNames[eventName] = {};
|
||||
zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
|
||||
zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
|
||||
symbolEventName = capture ? symbolCapture : symbol;
|
||||
} else {
|
||||
symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
|
||||
prepareEventNames(eventName, eventNameToString);
|
||||
symbolEventNames = zoneSymbolEventNames[eventName];
|
||||
}
|
||||
const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
|
||||
let existingTasks = target[symbolEventName];
|
||||
let isExisting = false;
|
||||
if (existingTasks) {
|
||||
|
@ -668,6 +667,7 @@ export function patchEventTarget(
|
|||
}
|
||||
|
||||
export function findEventTasks(target: any, eventName: string): Task[] {
|
||||
if (!eventName) {
|
||||
const foundTasks: any[] = [];
|
||||
for (let prop in target) {
|
||||
const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
|
||||
|
@ -683,6 +683,20 @@ export function findEventTasks(target: any, eventName: string): Task[] {
|
|||
}
|
||||
return foundTasks;
|
||||
}
|
||||
let symbolEventName = zoneSymbolEventNames[eventName];
|
||||
if (!symbolEventName) {
|
||||
prepareEventNames(eventName);
|
||||
symbolEventName = zoneSymbolEventNames[eventName];
|
||||
}
|
||||
const captureFalseTasks = target[symbolEventName[FALSE_STR]];
|
||||
const captureTrueTasks = target[symbolEventName[TRUE_STR]];
|
||||
if (!captureFalseTasks) {
|
||||
return captureTrueTasks ? captureTrueTasks.slice() : [];
|
||||
} else {
|
||||
return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) :
|
||||
captureFalseTasks.slice();
|
||||
}
|
||||
}
|
||||
|
||||
export function patchEventPrototype(global: any, api: _ZonePrivate) {
|
||||
const Event = global['Event'];
|
||||
|
|
Loading…
Reference in New Issue