I figured the mongodb change stream extends the EventEmitter class, so I tried removing events I installed by using the removeListener function. After calling removeListener on the change stream it still fired on change. May be I'm just using the wrong function reference when removing, but I can not see how.
I found out removeAllListeners does remove the attached listener. But I need to be in control what listener to remove.
const change_listener = (change) => {
console.log(change_stream.listenerCount("change"))
change_stream.removeListener("change", change_listener)
console.log(change_stream.listenerCount("change"))
}
change_stream.on("change", change => change_listener(change))
should output 1 0
but it outputs 1 1
and the listener goes on listening.
Using .once instead of .on only helps half the way. I would still need removeListener because I need to be able to cancel the listener early.
The problem is due to the function you are removing.
This should work:
const change_listener = (change) => {
console.log(change_stream.listenerCount("change"))
change_stream.removeListener("change", change_listener)
console.log(change_stream.listenerCount("change"))
}
change_stream.on("change", change_listener)
Note that change => change_listener(change)
is a function and it is different from change_listener