valor - Obtener una mejor comprensión de las funciones de devolución de llamada en JavaScript
retornar valor de una funcion javascript (8)
Entiendo pasar una función a otra función como devolución de llamada y hacer que se ejecute, pero no entiendo la mejor implementación para hacer eso. 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 myFirstFunction, si devuelvo una nueva devolución de llamada (), funciona y ejecuta la función anónima, pero ese no es el enfoque correcto para mí.
Debe verificar si la devolución de llamada existe, y 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 (nodej generalmente pasa el error
y los data
a la devolución de llamada). ¡Buscar en su código fuente ayudaría!
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);
};
- devolución de llamada (argumento_1, argumento_2);
- callback.call (some_object, argument_1, argument_2);
- callback.apply (some_object, [argument_1, argument_2]);
El método que elija depende de si:
- Usted tiene los argumentos almacenados en una matriz o como variables distintas.
- Desea 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 quiere pasar el contexto del objeto, use nulo o indefinido. En este último caso, el objeto global se usaría para "esto".
Documentos para Function.call , Function.apply
Las devoluciones de llamada se refieren a señales y "nuevas" se trata de crear instancias de objetos.
En este caso, sería aún más apropiado ejecutar solo "callback ();" que "devolver nueva devolución de llamada ()" porque de todos modos no está haciendo nada con un valor de retorno.
(Y la prueba arguments.length == 3 es realmente anticuada, es mejor verificar que el param de devolución de llamada existe y es una función).
Puedes simplemente decir
callback();
Alternativamente, puede usar el método de call
si desea ajustar el valor de this
dentro de la devolución de llamada.
callback.call( newValueForThis);
Dentro de la función, this
sería lo que sea newValueForThis
.
Puedes usar:
if (callback && typeof(callback) === "function") {
callback();
}
el siguiente ejemplo es un poco más completo:
function mySandwich(param1, param2, callback) {
alert(''Started eating my sandwich./n/nIt has: '' + param1 + '', '' + param2);
var sandwich = {toppings: [param1, param2]},
madeCorrectly = (typeof(param1) === "string" && typeof(param2) === "string") ? true : false;
if (callback && typeof(callback) === "function") {
callback.apply(sandwich, [madeCorrectly]);
}
}
mySandwich(''ham'', ''cheese'', function(correct) {
if(correct) {
alert("Finished eating my " + this.toppings[0] + " and " + this.toppings[1] + " sandwich.");
} else {
alert("Gross! Why would I eat a " + this.toppings[0] + " and " + this.toppings[1] + " sandwich?");
}
});
la implementación adecuada sería:
if( callback ) callback();
esto hace que el parámetro de devolución de llamada sea opcional ...
puedes echar un vistazo en este enlace. Te agrego un ejemplo básico que explica la función de devolución de llamada en javascript. jsfiddle
var x=0;
function testCallBack(param1, param2, callback) {
alert(''param1= '' + param1 + '', param2= '' + param2+'' X=''+x);
if (callback && typeof(callback) === "function") {
x+=1;
alert("Calla Back x= "+x);
x+=1;
callback();
}
}
testCallBack(''ham'', ''cheese'',function(){
alert("Function X= "+x);
});
function checkCallback(cb)
{
if(cb || cb!='''')
{
if(typeof window[cb] === ''undefined'') alert(''Callback function not found.'');
else window[cb].call(this,Arg1, Arg2);
}
}