Pase la función como un parámetro a otra función. Esta función se llama función de devolución de llamada
A menudo se encuentra en esta situación que las capas A y B de un proyecto son completadas por diferentes personas en colaboración. La capa A es responsable de la función FUNA, y la capa B es responsable de FUNCB. Cuando B Layer quiere usar los datos de cierto módulo, le dijo al personal de A Layer que necesito que proporcione datos que satisfagan ciertas necesidades y que me proporcione una interfaz.
El personal del nivel A dijo: Le proporcionaré datos y cómo mostrar y procesarlo es el negocio de B.
Por supuesto, la capa B no puede proporcionar una interfaz de datos para cada requisito. B proporciona a A una interfaz para pasar. B obtiene los datos, y luego B escribe la función para mostrarlo.
Es decir, debe trabajar con otros y otros proporcionan datos, y no necesita concentrarse en cómo otros obtienen o crean datos. Solo necesita operar en los datos que obtiene. Necesita usar una función de devolución de llamada en este momento
Por lo tanto, las devoluciones de llamada son esencialmente un patrón de diseño, y los principios de diseño de jQuery (incluidos otros marcos) siguen este patrón.
Un ejemplo del uso de devoluciones de llamada en sincronización (bloqueo) es ejecutar FUNC2 después de ejecutar el código FUNC1.
La copia del código es la siguiente:
var func1 = function (devolución de llamada) {
// Haz algo.
(Callback && typeOf (llamado) === "función") && callback ();
}
func1 (func2);
var func2 = function () {
}
Ejemplo de devoluciones de llamada asincrónicas:
La copia del código es la siguiente:
$ (documento) .Ready (devolución de llamada);
$ .AJAX ({
URL: "test.html",
contexto: document.body
}). Done (function () {
$ (esto) .AddClass ("hecho");
}). fail (function () {
alerta ("error");
}). Always (function () {
alerta ("completo");
});
Tenga en cuenta que la solicitud AJAX es realmente asíncrona, pero el navegador solicita esta solicitud. Cuando se cambia el estado de la solicitud, si se ha establecido una devolución de llamada antes, el hilo asíncrono generará un evento de cambio de estado y lo pondrá en la cola de procesamiento del motor JavaScript para esperar el procesamiento. Ver: http://www.phpv.net/html/1700.html
¿Cuándo se ejecutará la devolución de llamada?
Las funciones de devolución de llamada generalmente se ejecutan por última vez en una situación sincrónica, pero no se pueden ejecutar en una situación asíncrona porque el evento no se desencadena o las condiciones no se cumplen.
Casos de uso de funciones de devolución de llamada
Carga de recursos: ejecute la devolución de llamada después de la carga dinámica de los archivos JS, ejecute la devolución de llamada después de cargar iframe, ejecute la devolución de llamada después de cargar la devolución de llamada de la operación AJAX, ejecute la devolución de llamada después de la carga de la imagen, AJAX, etc.
Los eventos DOM y los eventos node.js se basan en el mecanismo de devolución de llamada (las devoluciones de llamada Node.js pueden tener problemas de anidación de devolución de llamada de varias capas).
El tiempo de retraso de SetTimeout es 0. Este truco a menudo se usa. La función llamada por setTimeout es en realidad una realización de devolución de llamada
Llamada en cadena: cuando la llamada en cadena, es fácil implementar la llamada en cadena en el método Evaluator (Setter) (o en los métodos que no devuelven los valores), pero el Getter de valor es relativamente difícil de implementar la llamada en cadena, porque necesita el Getter de valor para devolver los datos que necesita en lugar de este puntero. Si desea implementar el método de cadena, puede usar una función de devolución de llamada para implementarlo.
La función llama a SetTimeOut y SetInterval obtiene su valor de retorno. Dado que ambas funciones son asincrónicas, es decir, su tiempo de llamadas y el proceso principal del programa son relativamente independientes, no hay forma de esperar su valor de retorno en el cuerpo, y el programa no se detendrá y esperará cuando se abran, de lo contrario el significado de SetTimeOut y SetInterval se perderá. Por lo tanto, no tiene sentido usar retorno, por lo que la devolución de llamada solo se puede usar. El significado de la devolución de llamada es notificar la función proxy de los resultados de la ejecución del temporizador para un procesamiento oportuno.
Debería tener algo de información recopilada en línea y debería entenderla. Me ordenaré un ejemplo por mí mismo:
La copia del código es la siguiente:
function Fun (num, devolución de llamada) {
if (num <0) {
alerta ("Llame a la función de nivel A para manejar!");
alerta ("Los datos no pueden ser negativos, error de entrada!");
} else if (num == 0) {
alerta ("Llame a la función de nivel A para manejar!");
alerta ("¡Este elemento de datos no existe!");
}demás{
alerta ("¡Llame a la función de nivel B para procesar!");
devolución de llamada (1);
}
}
función test () {
var num = document.getElementById ("puntaje"). valor;
Diversión (num, función (retroceder) {// función de procesamiento de la capa B anónima
alerta (":"+back);
if (num <2)
alerta ("El número es 1");
más if (num <= 3)
alerta ("El número es 2 o 3!");
demás
alerta ("número mayor que 3!");
})
}
Cuando la función comienza a ejecutar diversión, primero vaya a determinar si NUM es un número negativo o cero, de lo contrario ejecuta la alerta de la función de procesamiento de la capa B (":"+retroceso); Salida 1 y determinarlo como <2, <= 3,> 3, etc.
Consejos de experiencia:
Es mejor asegurarse de que la devolución de llamada exista y debe ser una referencia de función o expresión de funciones:
La copia del código es la siguiente:
(Callback && typeOf (llamado) === "función") && callback ();
La copia del código es la siguiente:
var obj = {
init: function (devolución de llamada) {
//HACER ...
if (callback && typeOf (llamado) === "function") && callback ()) {
devolución de llamada ('init ...'); // devolución de llamada
}
}
Finalmente, ¿sobre por qué necesita usar una función de devolución de llamada? La siguiente metáfora es muy vívida e interesante.
Si tiene algo que hacer, vaya al siguiente dormitorio para encontrar un compañero de clase y descubra que la persona no está allí, ¿qué debe hacer?
Método 1: Vaya al siguiente dormitorio cada pocos minutos para ver si la persona está ahí
Método 2: Llame a alguien en el mismo dormitorio con él y llámelo cuando lo vea regresar
El primero está encuestando, y el segundo es la devolución de llamada.
Entonces dices, ¿puedo esperar directamente en el dormitorio de al lado hasta que regresen mis compañeros?
Sí, pero de esta manera, podrías haber ahorrado tiempo para hacer otras cosas, pero ahora tienes que desperdiciarlo en esperar. Convierta la llamada asíncrona original sin bloqueo en una llamada sincrónica de bloqueo.
Las devoluciones de llamada de JavaScript se utilizan en escenarios de llamadas asincrónicas, y el rendimiento del uso de devoluciones de llamada es mejor que las encuestas.