# Event: off'ing an on event to perform only once

**URL:** <https://discourse.nodered.org/t/event-offing-an-on-event-to-perform-only-once/83726>\
**Category:** Core Development\
**Created:** [14 December 2023 20:32 UTC](https://discourse.nodered.org/t/event-offing-an-on-event-to-perform-only-once/83726 "2023-12-14T20:32:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![gregorius](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/gregorius/32/73816_2.png) [@gregorius](https://discourse.nodered.org/u/gregorius)\
**Post date:** [14 December 2023 20:32 UTC](https://discourse.nodered.org/t/event-offing-an-on-event-to-perform-only-once/83726/1 "2023-12-14T20:32:39Z")

</div>

Hi There,

I think I might have a found a minor discrepancy in the event handling [code](https://github.com/node-red/node-red/blob/0e8d3127944a91f39fb49bcb4b388b184ce11edd/packages/node_modules/%40node-red/editor-client/src/js/events.js#L41-L49) of the client.

It happens because of the pattern I use to [initialise sidebars](https://discourse.nodered.org/t/tutorial-create-a-sidebar-plugin-and-persist-the-data-in-a-config-node/82020/13) - since `RED.events.once(...)` does not exist, I use:

```auto
var initialiseConfigNodeOnce = () => {
      RED.events.off('runtime-state', initialiseConfigNodeOnce);
....
};
RED.events.on('runtime-state', initialiseConfigNodeOnce);

```

Unfortunately what happens in the event handler is that the `handler[evt]` array is modified by the [off call](https://github.com/node-red/node-red/blob/0e8d3127944a91f39fb49bcb4b388b184ce11edd/packages/node_modules/%40node-red/editor-client/src/js/events.js#L29) so that it shrinks by 1. This means the index in the [for loop](https://github.com/node-red/node-red/blob/0e8d3127944a91f39fb49bcb4b388b184ce11edd/packages/node_modules/%40node-red/editor-client/src/js/events.js#L44) is off by one, i.e. one too large.

This is indeed the case, so I put in this [fix](https://github.com/gorenje/cdn.flowhub.org/compare/c1e90298bd1548b6310d9e8fb9d3dc4f9f04f11d..a5111ba11ba94af664f40592da13d395711b9cfd), as follows:

```auto
let cpyHandlers = [...handlers[evt]];

for (var i=0;i<cpyHandlers.length;i++) {
    try {
        cpyHandlers[i].apply(null, args);
    } catch(err) {

```

i.e., make a shallow copy of the events array before iterating through it.

I don't know whether this is something that should be fixed or whether a `once` would be better approach or whether my initialising of sidebar nodes is off-by-one (so to speak).

If desired, I can put up a PR to apply the fix.

Hope it Helps!

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [15 December 2023 08:10 UTC](https://discourse.nodered.org/t/event-offing-an-on-event-to-perform-only-once/83726/2 "2023-12-15T08:10:28Z")

</div>

A pr would be welcome

---

<div class="post-metadata">

**Author:** ![gregorius](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/gregorius/32/73816_2.png) [@gregorius](https://discourse.nodered.org/u/gregorius)\
**Post date:** [15 December 2023 10:21 UTC](https://discourse.nodered.org/t/event-offing-an-on-event-to-perform-only-once/83726/3 "2023-12-15T10:21:12Z")

</div>

Ok, done --\> [Client/Editor Events: fix off-in-on pattern emulating once by gorenje · Pull Request #4484 · node-red/node-red · GitHub](https://github.com/node-red/node-red/pull/4484)

I also removed a blank line...

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)\
**Post date:** [13 February 2024 10:21 UTC](https://discourse.nodered.org/t/event-offing-an-on-event-to-perform-only-once/83726/4 "2024-02-13T10:21:21Z")

</div>

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.
