javascript – Error calling secondary method via CALLBACK: Uncaught TypeError: Cannot read property 'secondary_method_name' of undefined

Question:

With JavaScript (ECMAScript-6), when calling a method via callback , if this method uses another method, the following error occurs:

Uncaught TypeError: Cannot read property 'second_method_name' of undefined

If the method is called directly it works perfectly. However if it is called via callback it does not work. If you don't have a secondary method, it works too.

How to call via callback a method of a class, when this method uses other methods?

Below is a code snippet reproducing the error:

 class TestOne{ metodoPrincipal(str_input){ this.metodoSecundario(str_input); } metodoSecundario(parametro){ alert("OK: " + parametro); } } function chamaViaCallback(callback, msg){ callback(msg); } var test_objeto = new TestOne(); // instancia o objeto // funciona chamando diretamente um método secundário test_objeto.metodoPrincipal('Testando método secundário chamado diretamente!'); // funciona via callback chamando diretamente o método secundário chamaViaCallback(test_objeto.metodoSecundario, 'método único chamado via callback!'); // não funciona via callback chamando método secundário chamaViaCallback(test_objeto.metodoPrincipal, 'método secundário chamado via callback!');

Answer:

This problem occurs because the metodoPrincipal function loses the object reference.

One way to solve this is to pass the object through bind :

chamaViaCallback(test_objeto.metodoPrincipal.bind(test_objeto), 'Foo');

Another alternative with an arrow function ( Arrow function ):

chamaViaCallback( msg => test_objeto.metodoPrincipal(msg), 'Bar');

If you prefer to call the arrow function without arguments and pass the message directly:

chamaViaCallback( () => { test_objeto.metodoPrincipal('Baz'); } );

Example:

 class TestOne{ metodoPrincipal(str_input){ this.metodoSecundario(str_input); } metodoSecundario(parametro){ console.log("OK: " + parametro); } } function chamaViaCallback(callback, msg){ callback(msg); } var test_objeto = new TestOne(); // instancia o objeto chamaViaCallback( test_objeto.metodoPrincipal.bind(test_objeto), 'Foo' ); chamaViaCallback( msg => test_objeto.metodoPrincipal(msg), 'Bar' ); chamaViaCallback( () => { test_objeto.metodoPrincipal('Baz'); } );
Scroll to Top