¿Cómo se llama la función de devolución de llamada en un motor de JavaScript?

No estoy seguro si entendí completamente la broma de tu pregunta. Si quieres conocer el funcionamiento interno profundo en un intento de hacer Node2, lamentablemente aún no puedo ayudarte. Si te gusto, vengo de un fondo de código sincrónico y de repente la gente comienza a hablar de asíncrono … entonces sé lo que duele bastante bien.


var http = require (‘http’),
req = http.request ({hostname: localhost, puerto: 8000, ruta: ‘/ log / AD43’, método: ‘POST’}, handleReply)
.on (‘error’, (err) => {
console.log (‘Problema con la publicación:’ + err.message);
});
req.write (“algo”);
req.end ();
función handleReply (res) {
if (res.statusCode! == 200) {
console.log (‘ESTADO:’ + res.statusCode);
console.log (‘HEADERS:’ + JSON.stringify (res.headers));
res.setEncoding (‘utf8’);
res.on (‘datos’, función (fragmento) {
console.log (‘CUERPO:’ + fragmento);
}). on (‘fin’, función () {
console.log (‘No más datos en respuesta’);
});
}

Lo anterior es un código válido que llama a una API web Rest y maneja el resultado. Más bien corto no lo es. Pero funciona e impresionantemente rápido.

Lo primero es que invocamos cosas al convertirlas en un objeto asignado a alguna variable. Por lo tanto, var http significa que podemos usar http para invocar métodos y funciones desde el objeto http. Este BTW se crea en un archivo separado … por lo tanto, se requiere aquí. Otros idiomas usan include o lib o import.

En segundo lugar, como la mayoría de los lenguajes de script java, puede asignar múltiples variables en una sola declaración, por lo tanto, una coma y el siguiente objeto llamado req que se crea invocando desde el objeto http las cosas relacionadas con la solicitud. Esto toma algunas opciones en ip y puerto, etc. y aquí viene … una devolución de llamada.

Esta vez nombré el significado de devolución de llamada cuando el objeto req regrese con resultados irá a la función handleReply y hará sus cosas. Tenga en cuenta que una devolución de llamada en general tiene un objeto que puede nombrar cualquier cosa (en este caso para la legibilidad res). Este objeto contiene propiedades y métodos relacionados con cualquier función de devolución de llamada.

Los objetos también pueden tener su propia funcionalidad. En este caso, el objeto req obtiene una nueva función .on que salta a la acción si se detecta un error. Esto también es una devolución de llamada. Sin embargo, aquí uso el método de la función de flecha. Esto es mucho más corto que llamar a una función separada. Simplemente más legible. Tenga en cuenta que, al igual que las devoluciones de llamada normales, se devuelve un objeto … en este caso lo llamé err.

También hay un método no ECMA anterior que utiliza una función anónima más elaborada como puede ver (dos veces) aquí:

res.on (‘datos’, función (fragmento) {
console.log (‘CUERPO:’ + fragmento);
}). on (‘fin’, función () {
console.log (‘No más datos en respuesta’);
});

Esto seria equivalente

res.on (‘datos’, (fragmento) => {
console.log (‘CUERPO:’ + fragmento);
}). on (‘fin’, () => {
console.log (‘No más datos en respuesta’);
});

JavaScript es de un solo subproceso. Entonces, la única forma de multitarea disponible es la multitarea cooperativa: pequeños trozos de código (controladores de eventos) se ejecutan uno por uno. En cualquier momento dado, JavaScript VM maneja un único procedimiento de controlador de eventos. Es por eso que es de misión crítica mantener pequeños controladores y no esperar a la finalización de las operaciones de E / S. En cambio, el tiempo de ejecución de JS (por ejemplo, NodeJS) es una lista de sondeo de solicitudes de E / S activas.

Por lo tanto, la función principal típica de la aplicación JS se ve así:

var listOfCompleteIOOperations = [];

while (verdadero) {
var nextOp = listOfCompleteIOOperations.shift (); // buscar la próxima operación
if (! nextOp) {
pollIOOperations (listOfCompleteIOOperations);
continuar;
}
// tengo una operación completa, manejarla
devoluciones de llamada var = nextOp.callbacks; // adquiere la lista de devolución de llamadas de op
para (devolución de llamada var de devoluciones de llamada)
llamar de vuelta(); // notificar finalización
}

Las operaciones de E / S se ejecutan en subprocesos separados. Y la función pollIOOperations [nativo] verifica su estado de finalización y llena listOfCompleteIOOperations .

IOOperation comienza cada vez que emite algo como http.request() proporcionando sus devoluciones de llamada que se adjuntan al objeto IOOpearation recién creado.

Hay una parte del sistema que se denomina bucle de eventos. Y otra parte llamada la cola de eventos. Puede pensarlo como una cola de devoluciones de llamada. El código JavaScript se ejecuta en el tiempo de ejecución de JavaScript.

El bucle de eventos comprueba constantemente la pila de llamadas del tiempo de ejecución de JavaScript y, cuando está vacío, toma una devolución de llamada de la cola de eventos y la introduce en la pila de llamadas de tiempo de ejecución de JavaScript. Una vez que la devolución de llamada está en el tiempo de ejecución de JavaScript, se ejecuta.

More Interesting

¿Por qué 'No se pueden hacer combinaciones' se considera un argumento fuerte contra las bases de datos NoSQL?

¿Cuál sería un gran "plan de estudios" para aprovechar todos los recursos gratuitos / de bajo costo en la web para aprender el diseño y desarrollo web?

¿Qué debo saber sobre Python para comenzar a aprender Django?

¿Necesita ser muy competente en el diseño de bases de datos para ser un analista de programador front-end?

¿Cuál es la estrategia correcta para aprender el desarrollo web completo desde cero?

¿Puedes crear una página de aterrizaje personal en WordPress?

En la lógica modal, ¿cómo se determina si un operador es referencialmente opaco o transparente?

¿Qué propiedades CSS no se pueden aplicar a Span?

¿Cómo se habilita la sangría de tabulación en los elementos de entrada de HTML / área de texto?

¿Cuál es el motor de plantillas de JavaScript más fácil de aprender para un desarrollo rápido?

¿Puedes almacenar archivos HTML generados en GitHub, aunque los siguientes archivos generados no sean los mismos?

En HTML y CSS, ¿por qué usamos '. 'para apuntar a clases y' # 'para apuntar a ID's?

Usando Python y SQLite3, o cualquier base de datos similar, ¿cómo puedo sincronizar múltiples archivos Db que son locales en diferentes máquinas?

¿Por qué hay una diferencia entre los títulos full stack / front end developer y solo el desarrollador web en cuanto a salario?

Cómo elegir una empresa de desarrollo web para redesarrollar tu sitio