Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.javascript > #32417
| 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> |
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
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