Trabajando en Angular 12 y experimentando un error cuando intento llamar a un método dentro de otro método. Aquí hay una abstracción de lo que estoy tratando (en TypeScript como estoy en Angular
export class SomeClass { testvariable onTaskCompleted(results) { if (!results) { return; } else { //The line below works console.log(results); //The line below throws and error this.drawSomething(results) //In fact any reference to something outside of this function throws an error this.testvariable = results } } //The unique thing about OnTaskCompleted is that it is also used as a callback handler by a 3rd party library which is throwing the error //It is called in another function like so. It is producing the correct result in onTaskCompleted, but breaks when I do something like above this.something.onResults(this.onResults); drawSomething(results) { if (!results) { return; } else { //perform some work } } } }Cuando ejecuto esto, obtengo un TypeError: No se pueden leer las propiedades de undefined. Si incluyo la función doSomethingElse en cualquiera de las otras funciones definidas en mi clase, no tengo ningún problema y funciona como se esperaba. La única otra cosa a tener en cuenta es que la función en la que tengo este problema doSomething () se usa como una devolución de llamada de una biblioteca externa y eso parece ser lo que arroja el error cada vez que incluyo cualquier referencia a algo 'fuera' de hacerAlgo en la función hacerAlgo. Cualquier pensamiento sería apreciado
la función en la que tengo este problema doSomething() se usa como una devolución de llamada
Lo más probable es que esté pasando la función de esta manera:
library.externalFunction(this.doSomething); Lo cual es un problema porque this parámetro se establece en la persona que llama, es decir, ya no será la instancia de la clase. Si doSomething() intenta acceder a una propiedad en this , será un error.
Una forma correcta de escribir esto sería:
library.externalFunction(param => this.doSomething(param)); Las funciones de flecha capturan this y se comportan más como se espera que se comporten.
Alternativamente, uno podría vincular explícitamente this en la función:
library.externalFunction(this.doSomething.bind(this));Aquí hay bastantes respuestas que explican el alcance de la función, por ejemplo, https://stackoverflow.com/a/20279485