Merge pull request #13358 from MoonE/dispatch-events

Avoid event creation when there are no listeners
This commit is contained in:
MoonE
2022-02-10 20:54:09 +01:00
committed by GitHub
4 changed files with 60 additions and 55 deletions
+6 -2
View File
@@ -172,9 +172,13 @@ class BaseObject extends Observable {
notify(key, oldValue) { notify(key, oldValue) {
let eventType; let eventType;
eventType = `change:${key}`; eventType = `change:${key}`;
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); if (this.hasListener(eventType)) {
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
}
eventType = ObjectEventType.PROPERTYCHANGE; eventType = ObjectEventType.PROPERTYCHANGE;
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); if (this.hasListener(eventType)) {
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
}
} }
/** /**
+40 -39
View File
@@ -83,49 +83,50 @@ class Target extends Disposable {
* @api * @api
*/ */
dispatchEvent(event) { dispatchEvent(event) {
/** @type {import("./Event.js").default|Event} */ const isString = typeof event === 'string';
const evt = typeof event === 'string' ? new Event(event) : event; const type = isString ? event : event.type;
const type = evt.type; const listeners = this.listeners_ && this.listeners_[type];
if (!listeners) {
return;
}
const evt = isString ? new Event(event) : /** @type {Event} */ (event);
if (!evt.target) { if (!evt.target) {
evt.target = this.eventTarget_ || this; evt.target = this.eventTarget_ || this;
} }
const listeners = this.listeners_ && this.listeners_[type]; const dispatching = this.dispatching_ || (this.dispatching_ = {});
let propagate; const pendingRemovals =
if (listeners) { this.pendingRemovals_ || (this.pendingRemovals_ = {});
const dispatching = this.dispatching_ || (this.dispatching_ = {}); if (!(type in dispatching)) {
const pendingRemovals = dispatching[type] = 0;
this.pendingRemovals_ || (this.pendingRemovals_ = {}); pendingRemovals[type] = 0;
if (!(type in dispatching)) {
dispatching[type] = 0;
pendingRemovals[type] = 0;
}
++dispatching[type];
for (let i = 0, ii = listeners.length; i < ii; ++i) {
if ('handleEvent' in listeners[i]) {
propagate = /** @type {import("../events.js").ListenerObject} */ (
listeners[i]
).handleEvent(evt);
} else {
propagate = /** @type {import("../events.js").ListenerFunction} */ (
listeners[i]
).call(this, evt);
}
if (propagate === false || evt.propagationStopped) {
propagate = false;
break;
}
}
--dispatching[type];
if (dispatching[type] === 0) {
let pr = pendingRemovals[type];
delete pendingRemovals[type];
while (pr--) {
this.removeEventListener(type, VOID);
}
delete dispatching[type];
}
return propagate;
} }
++dispatching[type];
let propagate;
for (let i = 0, ii = listeners.length; i < ii; ++i) {
if ('handleEvent' in listeners[i]) {
propagate = /** @type {import("../events.js").ListenerObject} */ (
listeners[i]
).handleEvent(evt);
} else {
propagate = /** @type {import("../events.js").ListenerFunction} */ (
listeners[i]
).call(this, evt);
}
if (propagate === false || evt.propagationStopped) {
propagate = false;
break;
}
}
if (--dispatching[type] === 0) {
let pr = pendingRemovals[type];
delete pendingRemovals[type];
while (pr--) {
this.removeEventListener(type, VOID);
}
delete dispatching[type];
}
return propagate;
} }
/** /**
+8 -10
View File
@@ -240,27 +240,25 @@ class ImageSource extends Source {
*/ */
handleImageChange(event) { handleImageChange(event) {
const image = /** @type {import("../Image.js").default} */ (event.target); const image = /** @type {import("../Image.js").default} */ (event.target);
let type;
switch (image.getState()) { switch (image.getState()) {
case ImageState.LOADING: case ImageState.LOADING:
this.loading = true; this.loading = true;
this.dispatchEvent( type = ImageSourceEventType.IMAGELOADSTART;
new ImageSourceEvent(ImageSourceEventType.IMAGELOADSTART, image)
);
break; break;
case ImageState.LOADED: case ImageState.LOADED:
this.loading = false; this.loading = false;
this.dispatchEvent( type = ImageSourceEventType.IMAGELOADEND;
new ImageSourceEvent(ImageSourceEventType.IMAGELOADEND, image)
);
break; break;
case ImageState.ERROR: case ImageState.ERROR:
this.loading = false; this.loading = false;
this.dispatchEvent( type = ImageSourceEventType.IMAGELOADERROR;
new ImageSourceEvent(ImageSourceEventType.IMAGELOADERROR, image)
);
break; break;
default: default:
// pass return;
}
if (this.hasListener(type)) {
this.dispatchEvent(new ImageSourceEvent(type, image));
} }
} }
} }
+6 -4
View File
@@ -457,10 +457,12 @@ class VectorSource extends Source {
this.featuresRtree_.load(extents, geometryFeatures); this.featuresRtree_.load(extents, geometryFeatures);
} }
for (let i = 0, length = newFeatures.length; i < length; i++) { if (this.hasListener(VectorEventType.ADDFEATURE)) {
this.dispatchEvent( for (let i = 0, length = newFeatures.length; i < length; i++) {
new VectorSourceEvent(VectorEventType.ADDFEATURE, newFeatures[i]) this.dispatchEvent(
); new VectorSourceEvent(VectorEventType.ADDFEATURE, newFeatures[i])
);
}
} }
} }