Path: csiph.com!weretis.net!feeder4.news.weretis.net!feeder5.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: comp.lang.javascript Subject: Re: ES6 class properties are undefined ? Date: Sun, 29 Jan 2017 14:00:40 +0100 Organization: PointedEars Software (PES) Lines: 75 Message-ID: <1771785.oMNUckLgyt@PointedEars.de> References: Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1485694841 1318 eJwFwYEBwCAIA7CXYGuLnKMg/59gwl+uCogCh1OzvCsTWdhup7cj2iKouU7eMrjJYsG+E3odRxBt (29 Jan 2017 13:00:41 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Sun, 29 Jan 2017 13:00:41 +0000 (UTC) User-Agent: KNode/4.14.2 X-NNTP-Posting-Host: eJwFwQkBACAIA8BK8g2MI+L6R/AuDIKbjoAHgx3qsc/lUB+O06Ylc1Xrs1FhlpjYnOXs2vgnsBEu X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&. 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: | | Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.