Skip to content

Commit a3c7ab9

Browse files
JiaLiPassionmhevery
authored andcommitted
feat: performance improvement for eventListeners (#34613)
PR Close #34613
1 parent 4d36b2f commit a3c7ab9

1 file changed

Lines changed: 39 additions & 25 deletions

File tree

packages/zone.js/lib/common/events.ts

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ export const globalSources: any = {};
4444
const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
4545
const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
4646

47+
function prepareEventNames(eventName: string, eventNameToString?: (eventName: string) => string) {
48+
const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
49+
const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
50+
const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
51+
const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
52+
zoneSymbolEventNames[eventName] = {};
53+
zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
54+
zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
55+
}
56+
4757
export interface PatchEventTargetOptions {
4858
// validateHandler
4959
vh?: (nativeDelegate: any, delegate: any, target: any, args: any) => boolean;
@@ -387,23 +397,12 @@ export function patchEventTarget(
387397
}
388398

389399
const zone = Zone.current;
390-
const symbolEventNames = zoneSymbolEventNames[eventName];
391-
let symbolEventName;
400+
let symbolEventNames = zoneSymbolEventNames[eventName];
392401
if (!symbolEventNames) {
393-
// the code is duplicate, but I just want to get some better performance
394-
const falseEventName =
395-
(eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
396-
const trueEventName =
397-
(eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
398-
const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
399-
const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
400-
zoneSymbolEventNames[eventName] = {};
401-
zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
402-
zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
403-
symbolEventName = capture ? symbolCapture : symbol;
404-
} else {
405-
symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
402+
prepareEventNames(eventName, eventNameToString);
403+
symbolEventNames = zoneSymbolEventNames[eventName];
406404
}
405+
const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
407406
let existingTasks = target[symbolEventName];
408407
let isExisting = false;
409408
if (existingTasks) {
@@ -668,20 +667,35 @@ export function patchEventTarget(
668667
}
669668

670669
export function findEventTasks(target: any, eventName: string): Task[] {
671-
const foundTasks: any[] = [];
672-
for (let prop in target) {
673-
const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
674-
let evtName = match && match[1];
675-
if (evtName && (!eventName || evtName === eventName)) {
676-
const tasks: any = target[prop];
677-
if (tasks) {
678-
for (let i = 0; i < tasks.length; i++) {
679-
foundTasks.push(tasks[i]);
670+
if (!eventName) {
671+
const foundTasks: any[] = [];
672+
for (let prop in target) {
673+
const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
674+
let evtName = match && match[1];
675+
if (evtName && (!eventName || evtName === eventName)) {
676+
const tasks: any = target[prop];
677+
if (tasks) {
678+
for (let i = 0; i < tasks.length; i++) {
679+
foundTasks.push(tasks[i]);
680+
}
680681
}
681682
}
682683
}
684+
return foundTasks;
685+
}
686+
let symbolEventName = zoneSymbolEventNames[eventName];
687+
if (!symbolEventName) {
688+
prepareEventNames(eventName);
689+
symbolEventName = zoneSymbolEventNames[eventName];
690+
}
691+
const captureFalseTasks = target[symbolEventName[FALSE_STR]];
692+
const captureTrueTasks = target[symbolEventName[TRUE_STR]];
693+
if (!captureFalseTasks) {
694+
return captureTrueTasks ? captureTrueTasks.slice() : [];
695+
} else {
696+
return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) :
697+
captureFalseTasks.slice();
683698
}
684-
return foundTasks;
685699
}
686700

687701
export function patchEventPrototype(global: any, api: _ZonePrivate) {

0 commit comments

Comments
 (0)