Estoy luchando por entender por qué este fragmento perdería el contexto de this . Lo que quería lograr es eliminar un (primer) argumento de la función que se ha ejecutado y que se ha logrado. El problema es que en este momento no puedo acceder a nada desde el alcance de la instancia de clase. ¿Alguien tiene idea de lo que ha sucedido aquí? Creo que podría estar relacionado con el método de doble flecha que se ha utilizado, pero no tengo idea de cómo solucionarlo.
class Callback { test = 'test'; callback(a) { console.log(this); console.log(a); } } const callback = new Callback(); const serverAdapter = (cb) => (_, args, context) => cb(args, context?.req); console.log("Having a context"); callback.callback('test'); console.log("Losing the context"); serverAdapter(callback.callback)(1,2,3);Salir:
[LOG]: "Having a context" [LOG]: Callback: { "test": "test" } [LOG]: "test" [LOG]: "Losing the context" [LOG]: undefined [LOG]: 2Cambia esto:
serverAdapter(callback.callback)(1,2,3);a esto:
serverAdapter(callback.callback.bind(callback))(1,2,3); Cuando pasa obj.foo como argumento, solo se pasa una referencia al método como una función simple y luego, cuando la función a la que se lo pasó llama a esa función, simplemente se llama como una función simple, no como obj.foo() por lo que ya no hay ninguna referencia al objeto original.
Hay múltiples formas de resolver esto. Usar .bind() es uno de esos mecanismos.
Si realmente fuera a utilizar esta clase como un administrador de devolución de llamada, podría crear el enlace en la clase de devolución de llamada de esta manera:
class Callback { test = 'test'; constructor() { // create bound method this.callback = this.callbackOp.bind(this); } callbackOp(a) { console.log(this); console.log(a); } } Luego, podría simplemente pasar obj.callback . callback como una devolución de llamada y automáticamente se vincularía a obj por usted.