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
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Une Bévue
Le #26424824
Le 29/01/2017 à 10:21, Une Bévue a écrit :
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...

il faut juste changer la ligne :
that.timerID = window.setInterval(that.init, 5000);

en
that.timerID = window.setInterval(function() {that.init();}, 5000);
Elhwen Dico
Le #26424891
Le 29/01/2017 à 10:21, Une Bévue a écrit :
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.
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...
Une Bévue
Le #26424906
Le 30/01/2017 à 19:53, Elhwen Dico a écrit :
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.

Ah oui, très juste, merci bien !
Publicité
Poster une réponse
Anonyme