Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.javascript > #32417

Re: ES6 class properties are undefined ?

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups comp.lang.javascript
Subject Re: ES6 class properties are undefined ?
Date 2017-01-29 14:00 +0100
Organization PointedEars Software (PES)
Message-ID <1771785.oMNUckLgyt@PointedEars.de> (permalink)
References <o6kc0n$jep$1@shakotay.alphanet.ch> <o6ki2m$ek5$1@news.albasani.net>

Show all headers | View raw


Martin Honnen wrote:

> On 29.01.2017 10:18, Une Bévue wrote:
>> let SocketService = class SocketService {
       ^^^^^^^^^^^^^         ^^^^^^^^^^^^^
DRY.

>>   constructor(url) {
>>     this.url = url;
>>     this.ws  = null;
>>     this.timerID = 0;

Consider

  Object.assign(this, {
    url: url,
    ws: null,
    timerID: 0
  });

>>     this.init();
>>   }
>>   init() {
>>     let that = this;
>>     this.ws = new WebSocket(this.url);
>>     this.ws.onclose = function() {
>>       that.timerID = window.setInterval(that.init, 5000);
>>     };
>>   }
>> }
>>
>> when I shut down the WebSocket server in order to test my script
>> i get : this.url = undefined; (that.url too)
>> only the first time init() is activated gives the correct value, why ?
>> it seems "this" is lost...
> 
> Try whether using
>    that.timerID = window.setInterval(function() { that.init(); }, 5000);
> instead of
>    that.timerID = window.setInterval(that.init, 5000);
> improves things.

Things can be improved more (i.e. more efficient) if the function is not 
created every time that the event listener is called:

  var init = function () { that.init(); };

  this.ws.onclose = function () {
    that.timerID = window.setInterval(init, 5000);
  };

Or, given that ES6 is already being used,

  var init = this.init.bind(this);

  this.ws.onclose = (function () {
    this.timerID = window.setInterval(init, 5000);
  }).bind(this);

so that the “that” variable becomes unnecessary.  [However, this comes at 
the price of flexibility: with .bind() for the event listener, “this” can no 
longer be used in it to refer to the object that fired the event.  So one 
might only want to use the first .bind() here.]

But in fact, this code does not make sense.  ISTM that the 
window.setInterval() should be window.setTimeout(); at least there should be 
a window.clearInterval() in .init() for the window.setInterval() in the 
event listener.  Otherwise whenever the WebSocket instance fires a “close” 
event, new "intervals" will pile up.

-- 
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Back to comp.lang.javascript | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

ES6 class properties are undefined ? Une Bévue <unbewusst.sein@fai.invalid> - 2017-01-29 10:18 +0100
  Re: ES6 class properties are undefined ? Martin Honnen <martin.honnen@gmx.de> - 2017-01-29 12:01 +0100
    Re: ES6 class properties are undefined ? Une Bévue <unbewusst.sein@fai.invalid> - 2017-01-29 12:14 +0100
      Re: ES6 class properties are undefined ? Martin Honnen <martin.honnen@gmx.de> - 2017-01-29 12:55 +0100
        Re: ES6 class properties are undefined ? Une Bévue <unbewusst.sein@fai.invalid> - 2017-01-29 15:50 +0100
    Re: ES6 class properties are undefined ? Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2017-01-29 14:00 +0100
      Re: ES6 class properties are undefined ? Une Bévue <unbewusst.sein@fai.invalid> - 2017-01-29 15:56 +0100

csiph-web