Estoy haciendo algunos experimentos con class y, extrañamente, en este caso especial, setInterval solo se llama una vez si paso test.method1() y obtengo un error si paso test.method1, ¿por qué?
class Test { constructor() { this.counter = 0; (async () => { this.test(); } )(); } test() { this.method1(); } method1() { let value; value = this.method2(); console.log(this.counter); } method2() { this.counter++; return this.counter; } } let test = new Test(); let id = setInterval(test.method1(), 1000);Recibo un error si paso test.method1, ¿por qué?
Porque this contexto se pierde. Si console.log(this) dentro de method1 , no obtendrá una instancia de Test . Básicamente, es
const orphanedMethod = test.method1; // I'm not bound to the test variable now... setInterval(orphanedMethod, 1000); // and if I try to access `this`, I'll get Window or sth like that Haga que method1 sea una función de flecha:
method1 = () => { let value; value = this.method2(); console.log(this.counter); }o vincularlo explícitamente al objeto al llamar:
setInterval(test.method1.bind(test), 1000);su error es que JS no puede encontrar el método method1 dentro del método de prueba porque el method1 solo se llama dentro de su método de prueba. Para hacer test.method1(), debe poner su definición de método1 dentro de su método de prueba.
otra cosa es que setInterval simplemente no funcionó, probablemente porque lo almacenó en una variable y no llamó a id(). Solo funcionó una vez porque llamaste explícitamente a test.method1() dentro de tu setInterval