Para saber qué es el infierno de devolución de llamada, tenemos que comenzar con Javascript síncrono y asíncrono.
¿Qué es Javascript síncrono?
En Synchronous Javascript, cuando ejecutamos el código, el resultado se devuelve tan pronto como el navegador puede hacerlo. Solo puede ocurrir una operación a la vez porque es de un solo subproceso. Por lo tanto, todos los demás procesos se ponen en espera mientras se ejecuta una operación.
¿Qué es Javascript asíncrono?
- Algunas funciones en Javascript requieren AJAX porque la respuesta de algunas funciones no es inmediata. Lleva algún tiempo y la siguiente operación no puede comenzar inmediatamente. Tiene que esperar a que la función termine en segundo plano. En tales casos, las devoluciones de llamada deben ser asíncronas.
- Hay algunas API web Javascript externas que permiten AJAX: Javascript asíncrono y XML.
En AJAX, muchas operaciones se pueden realizar simultáneamente.
¿Qué es una devolución de llamada?
- Las devoluciones de llamada no son más que funciones que tardan un tiempo en producir un resultado.
- Por lo general, estas devoluciones de llamada asíncronas (async abreviatura de asíncrono) se utilizan para acceder a valores de bases de datos, descargar imágenes, leer archivos, etc.
- Como estos tardan en terminar, no podemos pasar a la siguiente línea porque podría arrojar un error diciendo que no está disponible ni podemos pausar nuestro programa.
- Por lo tanto, debemos almacenar el resultado y volver a llamar cuando esté completo.
¿Qué es el infierno de devolución de llamada?
Este es un gran problema causado por la codificación con devoluciones de llamada anidadas complejas. Aquí, todas y cada una de las devoluciones de llamada toman un argumento que es el resultado de las devoluciones de llamada anteriores. De esta manera, la estructura del código parece una pirámide, lo que dificulta su lectura y mantenimiento. Además, si hay un error en una función, todas las demás funciones se ven afectadas.
Ejemplo: Este es el ejemplo del típico infierno de devolución de llamada.
app.get("/details", function (req, res) { var name = req.query.name; console.log(name); Scopus.find({ name: name }, { '_id': 0, 'authorId': 1 }, function (err, result) { if (err) { } else { var searchResult = result[0]["authorId"]; console.log(searchResult); var options = { url: "https://api.elsevier.com/content/author/author_id/" + searchResult + "?apiKey", headers: { 'Accept': 'application/json' } }; request(options, function (error, response, body) { if (error) { // Print the error if one occurred console.error('error in Authors :', error); // Print the response status code if a response was received console.log('statusCode:', response && response.statusCode); res.send("error") } else if (!error) { var jsonObj = JSON.parse(body); if (jsonObj['author-retrieval-response'] == undefined) { res.send("No details"); } else { var reqData = jsonObj['author-retrieval-response'][0]; var authprofile = reqData["author-profile"] var names = authprofile["preferred-name"]["indexed-name"] console.log(names); var citation = reqData["coredata"]["citation-count"]; var query = { authorId: searchResult }; Scopus.findOneAndUpdate(query, { name: names, citationCount: citation }, function (err, doc, res) { if (err) { console.log("error"); } else { console.log("success"); } }) res.render("details", { data: reqData }); } } }); } }) });
Puede notar que las devoluciones de llamada anidadas se ven como una pirámide que hace que sea difícil de entender.
¿Cómo escapar de un infierno de devolución de llamada?
- JavaScript proporciona una manera fácil de escapar de un infierno de devolución de llamada. Esto se hace mediante la cola de eventos y las promesas.
- Una promesa es un objeto devuelto por cualquier función asincrónica, al que se pueden agregar métodos de devolución de llamada en función del resultado de la función anterior.
- Las promesas usan el método .then() para llamar a las devoluciones de llamada asíncronas. Podemos enstringr tantas devoluciones de llamadas como queramos y el orden también se mantiene estrictamente.
- Las promesas usan el método .fetch() para obtener un objeto de la red. También utiliza el método .catch() para detectar cualquier excepción cuando falla un bloque.
- Entonces, estas promesas se colocan en la cola de eventos para que no bloqueen el código JS posterior. Además, una vez que se devuelven los resultados, la cola de eventos finaliza sus operaciones.
- También hay otras palabras clave y métodos útiles como async, wait, settimeout() para simplificar y hacer un mejor uso de las devoluciones de llamada.
Publicación traducida automáticamente
Artículo escrito por sathiyajith19 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA