ES6 class properties deviennent "undefined" ???
Le
Une Bévue

J'ai une class comme ça :
let SocketService = class SocketService {
constructor(url) {
this.url = url;
this.ws = null;
this.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);
};
}
}
quand j'arrêt mon WebSocket server afin de tester mon script,
j'obtiens :
this.url = undefined; (that.url aussi)
c'est seulement à la première fois où init() est lancé que j'obtiens des
valeurs "correctes", pourquoi ?
tout se passe "comme si" >this< était perdu
let SocketService = class SocketService {
constructor(url) {
this.url = url;
this.ws = null;
this.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);
};
}
}
quand j'arrêt mon WebSocket server afin de tester mon script,
j'obtiens :
this.url = undefined; (that.url aussi)
c'est seulement à la première fois où init() est lancé que j'obtiens des
valeurs "correctes", pourquoi ?
tout se passe "comme si" >this< était perdu
il faut juste changer la ligne :
en
that.timerID = window.setInterval(function() {that.init();}, 5000);
Je suis pas un spécialiste, mais
init() {
this.ws = new WebSocket(this.url);
this.ws.onclose = () => {
this.timerID = window.setInterval(this.init.bind(this), 5000);
};
}
ça pourrait le faire...
La forme arrow function fait que this reste bon dans la fonction onclose.
Le bind fixe le this d'une fonction à la valeur passée en argument.
Ah oui, très juste, merci bien !