Obteniendo una mejor comprensión de las funciones de devolución de llamada en JavaScript
Entiendo pasar una función a otra función como un callback y hacer que se ejecute, pero no estoy comprendiendo la mejor forma de implementarlo. Estoy buscando un ejemplo muy básico, como este:
var myCallBackExample = {
myFirstFunction : function( param1, param2, callback ) {
// Do something with param1 and param2.
if ( arguments.length == 3 ) {
// Execute callback function.
// What is the "best" way to do this?
}
},
mySecondFunction : function() {
myFirstFunction( false, true, function() {
// When this anonymous function is called, execute it.
});
}
};
En miFirstFunction, si hago return new callback(), entonces funciona y ejecuta la función anónima, pero eso no me parece el enfoque correcto.
Respuesta #1
Puedes simplemente decir
callback();
Alternativamente, puedes usar el método call si deseas ajustar el valor de this dentro de la función de retorno de llamada.
callback.call( newValueForThis);
Dentro de la función, this sería lo que sea newValueForThis.
Respuesta #2
Deberías verificar si el callback existe y si es una función ejecutable:
if (callback && typeof(callback) === "function") {
// execute the callback, passing parameters as necessary
callback();
}
Muchas bibliotecas (jQuery, dojo, etc.) usan un patrón similar para sus funciones asincrónicas, así como node.js para todas las funciones asincrónicas (nodejs usualmente pasa error y data al callback). ¡Revisar su código fuente ayudaría!
Respuesta #3
Hay 3 posibilidades principales para ejecutar una función:
var callback = function(x, y) {
// "this" may be different depending how you call the function
alert(this);
};
- callback(argument_1, argument_2);
- callback.call(algun_objeto, argumento_1, argumento_2);
- callback.apply(algun_objeto, [argumento_1, argumento_2]);
El método que elijas depende de si:
- Tienes los argumentos almacenados en un arreglo o como variables distintas.
- Quieres llamar a esa función en el contexto de algún objeto. En este caso, usar la palabra clave "this" en esa devolución de llamada haría referencia al objeto pasado como argumento en call() o apply(). Si no quieres pasar el contexto del objeto, usa null o undefined. En este último caso, se usaría el objeto global para "this".
Documentos para Function.call, Function.apply
