Búsqueda de sitios web

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);
};
  1. callback(argument_1, argument_2);
  2. callback.call(algun_objeto, argumento_1, argumento_2);
  3. callback.apply(algun_objeto, [argumento_1, argumento_2]);

El método que elijas depende de si:

  1. Tienes los argumentos almacenados en un arreglo o como variables distintas.
  2. 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

Artículos relacionados