vue-sse icon indicating copy to clipboard operation
vue-sse copied to clipboard

sse.once(event,fn), fn triggered multiple times

Open lgCode opened this issue 2 years ago • 0 comments

Use this.$sse.once(), it will be triggered continuously instead of only once.

sorry,I won't use jest to write this test (-。-!)

I made the following modifications to test the feasibility:

path: src/sse-client.js

api: once

`once(event, handler) {

//old   
-    this.on(event, (e) => {
-     this.off(event, handler);
-     handler(e);
-    });


//new change-1: start
 const once = e => {
   handler(e);
   this.off(event, handler);
 };
 once.initialhandle = handler;//
 this.on(event, once);

//change-1: end
return this;

}`

api: off

`off(event, handler) { if (!this._handlers[event]) { // no handlers registered for event return this; }

  //old
  const idx = this._handlers[event].indexOf(handler);
     if (idx === -1) {
     // handler not registered for event
     return this;
   }
   // remove handler from event
   this._handlers[event].splice(idx, 1);

  //new  change-2 start
  // if handler is null ,remove all handler from event
  if (!handler) {
    delete this._handlers[event];
    return this;
  }

  //initialhandle 标识出 once 的handler
  this._handlers[event] = this._handlers[event].filter(
    item => item !== handler && item.initialhandle != handler
  );
  //change-2 end


  if (this._handlers[event].length === 0) {
    // remove listener since no handlers exist
    this._source.removeEventListener(event, this._listeners[event]);
    delete this._handlers[event];
    delete this._listeners[event];
  }
  return this;


}

`

lgCode avatar Mar 20 '22 07:03 lgCode