Callbacks
Clase 7 de 31 • Curso de Fundamentos de Node.js
Contenido del curso
Clase 7 de 31 • Curso de Fundamentos de Node.js
Contenido del curso
Fabián Ignacio Toro Riquelme
Francisco Enrique Giménez Vera
Juan David González Rodríguez
Daniel Alberto Esquinazi
Guillermo M
Platzi Team
Enmanuel Castillo
Luis Ruiz Ramos
DARWIN JUAN CARLOS CATUNTA GARCIA
Usuario anónimo
Reinaldo Mendoza
Vanesa Percy
Alejandro Giraldo Londoño
ANTHONY JEAMPIER RANGEL RODRIGUEZ
Matías Wasiak
Juan Esteban Deossa Pertuz
Alexander Nova Arevalo
Pablo Domínguez Durán
Vanesa Percy
Alexis Bustamante
Diego Alejandro Moreno Pedroza
Karl Behrens Gil
Vanesa Percy
Jonathan Sánchez Luna
Miguel Angel Zuluaga Palacios
Denilson Alexis Arguello Noguera
Carlos Enrique Ramírez Flores
Mauricio Gonzalez Falcon
Emanuel Zarazaga
Brando Rodríguez
Carlos Enrique Ramírez Flores
David Antonio Garcia Saaib
Axel Franklin Valero Sánchez
Benjamin Cataldo Lopez
Ricardo Oriel Cuan Sánchez
Orlando Flores Huanca
Tomas Goldenberg
Jorge Eliecer Rangel Jimenez
Cristobal Peña
Este profe es maquina loco, se le entiende todo!
Qué otros cursos tiene?
Si exacto !! :D pase mucho tiempo entendiendo la asincronía de JavaScript :D
Funciones Callback
Una funcion callback es una funcion que es pasada como argumento a otra funcion, para ser llamada(called back) en otro momento.
La funcion que recibe como argumento otras funciones es denominada funcion de orden superior (higher-order function), esta contiene la logica correspondiente para ejecutar adecuadamente la funcion callback.
En el siguiente codigo
setTimeout(console.log('Hello'), 1000)
setTimeout es una higher-order function y console.log es una callback function
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined
Debe enviarse una función, no la llamada a la misma. Ejemplo:
setTimeout(function(){ console.log('Hello'); }, 1000);
Gracias por el aporte compañero 🔥🔥
Creo que me hacía falta esta clase para comprender definitivamente los callback y las promise. Como recomendación también sería bueno para complementar que vieran los cursos de Sasha en Fundamentos de JS, y el curso profesional de JS con Richard.
Total, de acuerdo.
Se agradece las recomendaciones
💚 Me costo entender mucho este tema de callbacks, así que te comparto mis notas profundizando más sobre el tema regresando a lo básico de las funciones. (o′┏▽┓`o) .
Callbacks
Para entender los callbacks primero hay que regresar a las funciones y entender su sintaxis:
Una función comienza con la palabra reservada "function" seguido del nombre de la función ("saludar" en este caso), después le sigue una lista de parámetros, estos entre paréntesis y separados por una coma en caso de ser mas de uno ("nombre" y "apellido" en este caso).
Nota: Los parámetros son la lista de variables que proponemos cuando se define una función. Mientras que los argumentos son los valores que se pasan a la función cuando ésta es invocada, estos deben coincidir en numero y separados por coma en caso de ser mas de uno con los parámetros propuestos.
// palabra reservada function + nombre de la función + (parámetro(s)) function saludar(nombre, apellido) { return "Hola " + nombre + " " + apellido; } // invocación de función + (argumento(s)) saludar("Alexander", "Book");
Nota2: la instrucción "return" especifica el valor devuelto por la función, esta puede o no regresar explícitamente los valores de los parámetros de la función.
Una vez comprendeos la sintaxis básica de lo que es una función, podemos entender que callback es una función que se pasa a otra función como un argumento, que luego se invoca dentro de la función externa para completar algún tipo de rutina o acción.
Un ejemplo sencillo de una función callback es el siguiente: comencemos por declarar una función de nombre "ending" que contenga un mensaje, después declaremos una función "starting" que igual contenga un mensaje, pero, esta va a recibir un solo parámetro, el cual llamaremos "callback", el cual va a recibir nuestra función ending para posteriormente invocarla dentro de sí misma.
function ending() { console.log("Terminando proceso... "); } function starting(callback) { console.log("Hola, soy una función asíncrona callback"); callback(); } console.log("Iniciando proceso... "); starting(ending);
Nota: entiéndase que el parámetro callback actúa como sustituto de nombre para la función ending en este caso.
Ok ahora hagamos algo un poco mas complejo, declaremos una función de saludo y despedida, donde nuestra función de despedida recibirá como parámetro un valor asignado a nuestra función de saludo, tomando en cuenta que al llamar a la función de saludo esta recibirá dos parámetros, un nombre y nuestra función de despedida para hacer el callback.
Respuesta:
// función de despedida function chao(nameB) { console.log("Adios " + nameB); } // función de saludo function hello(nameA, callback) { console.log("Hola " + nameA); // callback a la función de despedida callback(nameA); } hello("Carlos", chao);
Nota: Los ejemplos anteriores son ejemplos de callback sincrónica, ya que se ejecuta inmediatamente.
Agregando asincronía: Una de las funciones más sencillas para agregar asincrónica a nuestros procesos es ejecutar un "timeout".
Recordemos que un callback consiste en una función que recibe como parámetro otra función, así que podemos incluir la declaración de la función que se recibirá como parámetro en el mismo llamado de nuestra función callback, de manera que:
function soyAsincrona(callback) { setTimeout(() => { console.log("Estoy siendo asíncrona"); callback(); }, 1000); } console.log("Iniciando proceso... "); soyAsincrona(function () { console.log("Terminando proceso... "); });
La primera vez que vi los callbacks me costo, pero ahora los reconoci de inmediato y supe que hacian antes de que el profesor lo dijera, gracias platzi
Que excelente aporte compañero, muy bien explicado.
RESUMEN:
En js las funciones son objetos de primera clase, primer nivel, son ciudadanos de primera clase que puedo usarlos como quiera. Pasarlos como parámetro.
//La asincronia se puede generar mediante en setTimeout console.log('Iniciando proceso...'); function soyAsincrono(elCallback) { console.log("Asigno setTimeout para volver asincrona una función como esta misma: \n " + soyAsincrono); setTimeout(function(){ console.log("Pasaron 3 segundos y me ejecuté"); elCallback(); }, 3000) }; soyAsincrono(function(){console.log("Después de esto demuestro que Soy el primer Callback")}); function hola(nombre, miCallback) { setTimeout(function () { console.log('Hola, '+ nombre); miCallback(nombre); }, 1500); } function adios(nombre, otroCallback) { setTimeout(function() {console.log('Adios', nombre); otroCallback();}, 5000); } hola('Alejandro', function (nombre) { adios(nombre, function() { console.log('Terminando proceso...'); }); }); hola('Alejandro estás probando "hola" las funciones independientemente, las pasas vacías', function () {}); adios('Alejandro estás probando "adios" las funciones independientemente, las pasas vacías', function () {});
gracias por el aporte
Buen aporte!
Cuando nosotros realizamos funciones asíncronas no tendremos realmente el control de en que momento se ejecutaran o se mostraran, por eso si queremos que una función asíncrona se muestre en un momento determinado después de que sucediera cierto evento, debemos de llamar o invocar esta función asíncrona dentro de otra función, para esto se usan los callbacks, son parámetros que reciben funciones para que se ejecuten dentro de un evento ya determinado.
Produciendo el .... tun tun tunnnn CALLBACK HELL, funcion de otra, de otra, de otra, de otra, de otra
Creo que la clave de la clase está en:
Dos funciones que son asíncronas, no se ejecutarían una después de otra, sino se llamaran dentro del Callback de la otra
Genial, gracias por esa frase tan clave.
es complejo !!! pero se entiende, hay que practicar. les dejo mi codigo.
Así es! Pero esto es increíblemente útil
El hecho de tener nuestros eventos asíncronos puede ser un problema de ves en cuando, por lo que si un evento depende de la ejecución previa de otro, una buena solución seria ejecutarlo dentro del evento dependiente. También nuestras funciones pueden compartir variables a lo largo de la ejecución.
Gracias, que buen aporte.
El asincronismo como ejemplo de la vida cotidiana:
Vas a un restaurant bar un viernes en la tarde después de una semana de agotamiento laboral, tienes hambre y mucha sed, así que realizas el siguiente pedido al mesero:
Pero, mientras esperas el platillo fuerte pides:
Resulta que hay demasiada gente en el restaurante, ya pasaron 10 minutos, te acabaste la botana y la cerveza ligera, y como aún no te sirven el molcajete, le hablas al mesero y le pides:
El mesero te vuelve a servir la botana y el bote de inmediato
Ya pasaron 20 minutos y estás a punto de cancelar el pedido inicial cuando de pronto te llega tu molcajete y tu tarro de cerveza oscura extra fría.
¡A COMER Y TOMAR QUE EL MUNDO SE VA A ACABAR!
Ahora veamos esto en código:
function servirBotana(numPedido) { // No hay tiempo de espera console.log('Pedido '+numPedido+': Botana servida'); } function servirBoteCervezaLigera (numPedido) { // No hay tiempo de espera console.log('Pedido '+numPedido+': Bote de cerveza ligera servido'); } function servirTarroOscuro (numPedido) { // No hay tiempo de espera console.log('Pedido '+numPedido+': Tarro de cerveza oscura servido'); } function prepararMolcajete(numPedido, callback) { // Tiempo de espera de 20Mins setTimeout(function () { callback(numPedido); }, 6000); // Utilizamos 6 segundos que representan 20 minutos porque no manches xD } let numPedido = 1; console.log('*** Pedido 1 realizado, lo están preparando ....'); prepararMolcajete(numPedido, function (numPedido) { console.log('Pedido '+numPedido+': Molcajete servido'); servirTarroOscuro(numPedido); console.log('* Pedido 1 servido'); }); numPedido = 2; console.log('* Pedido 2 realizado'); servirBotana(numPedido); servirBoteCervezaLigera(numPedido); console.log('* Pedido 2 servido'); numPedido = 3; setTimeout(function () { // Después de 10 minutos de espera console.log('* Pedido 3 realizado'); servirBotana(numPedido); servirBoteCervezaLigera(numPedido); console.log('* Pedido 3 servido'); }, 3000); // Utilizamos 3 segundos que representan 10 minutos porque no manches xD
Puntos importantes en este ejemplo:
En este ejemplo sólo se considera el uso de los callbacks, pues es una tema que se complica mucho más que el uso de promesas y fetch. Espero les sirva el aporte.
I loved your example!!
Si quieren profundizar mas pueden seguir este curso Curso de Asincronismo en Javascript
agregado a pendientes, gracias!
Gracias tenia que repasar!
Vi el tema de callback en 3 cursos diferentes y en este lo pude entender perfectamente. Me gustó como lo explicó.
Callbacks
function hola(nombre, micallback) { setTimeout(function() { console.log("Hello, " + nombre); micallback(nombre); }, 1000); } function adios(nombre, otrocallback) { setTimeout(function() { console.log("Adios", nombre); otrocallback(); }, 1000); } console.log("Iniciando"); hola("Brando", function(nombre) { adios(nombre, function() { console.log("Terminando"); }); });
gracias!
Los callbacks son útiles cuando no sabemos cuanto tiempo va a tardar algo pero cuando termine queremos que pase algo mas
El callback se puede interpretar menos como una función y mas como la continuación de la función actual, como el .then, como el llamado al siguiente paso
function hola(nombre, param) { setTimeout(function() { console.log('Hola', nombre) param(nombre) //aqui se llama al callback y se manda un parametro },1000) } console.log('iniciando proceso') function adios(nombre, param) { setTimeout(function() { console.log('Adios', nombre) param() //aqui se llama al callback },1000) } //funcion con callback como parametro hola('Adranuz', function(nombre) { adios(nombre, function() { console.log('Proceso terminado') }) })
Hice un pequeño ejemplo para entender mejor esta clase. Creo que con esta clase ya me quedó claro el tema de los callbacks
Interesante, además que uno llama al otro se pueden encadenar procesos de forma ciclica
Recomiendo mucho el curso de V8, se explica muy muy bien la parte de los callbacks
Ufff. Que bien explicado y eso de programadores asíncronos pues es alentador. :)
8- FUNCIONES CON CALLBACKS PARA LLAMAR A OTRAS FUNCIONES ADEMAS VEREMOS HERENCIA DE PARAMS
function hola(nombre ,miCallback){
setTimeout( ()=>{
console.log(hola ${nombre})
miCallback(nombre); **1 //lGLOSARIO ABAJO DE TODO
},2000 )
};
function adios(nombre,otroCallback){
setTimeout(()=>{
console.log("adios", nombre);
otroCallback();
},1000)
}
console.log("inicia el programa"); hola("tomas",(nombre)=>{ adios(nombre,()=>{ console.log("finaliza el programa") }) })
TEMINAL: inicia el programa hola Tomas adios Tomas finaliza el programa |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //ES IMPORTANTISIMO ENCADENARLAS, //QUE EL CALLBACK DE CADA FUNCION SEA LLAMAR A LA SIGUIENTE FUNCION Y ASI SUCESIVAMENTE!
(SI NO LO ENCADENARIAMOS Y HARIAMOS) hola(nombre, ()=>{} ) adios(nombre, ()=>{} ) SU OUTPUT SERIA 1adios 2hola
GLOSARIO|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| **1 //le enviamos params via callback a las funciones que encadenaremos
Example Calbacks
function hello(name, myCallback) { setTimeout(() => { console.log("hello", name); myCallback(); }, 1500); } function speaks(speaksCallback) { setTimeout(() => { console.log("bla bla bla..."); speaksCallback(); }, 2500); } function bye(name, otherCallback) { setTimeout(() => { console.log("bye", name); otherCallback(); }, 100); } console.log("Init process"); hello("George", function () { speaks(function () { bye("George", function () { console.log("End process"); }); }); });
Muy buena la clase y felicito al profesor. Por fin me queda claro este tema.