//peticiones a servidor en mongoDB
function requestHandler(req,res) {
/*voy a hacer una consulta a la DB por medio de un id
... cuando la DB termine de mandarme una respuesta
... voy a manejar la respuesta a traves de la funcion
... y nos puede mandar un error o un usuario
... por lo que habrá una función para cualquiera de los casos
*/
User.findById(req.userId, function(err, user) {
//se manda a la lista de espera, y hasta que obtenga el resultado
//... se generará la función
if (err) { //si obtenemos un error
res.send(err) //mandar el error
} else {
/* Y realizamos otra consulta buscando una tarea por id en la lista de tareas del usuario que obtuvimos
... manejamos la respuesta a traves de una funcion y dependiendo lo que revibamos usamos la sentencia de la funcion
*/
Tasks.findById(user.taskId, function(err, task){
if (err) {
return res.send(err)
} else {
//una marca de que se completó la tarea exitosamente
tasks.completed = true
//una señal de que se guardó exitosamente, que el proceso es mandar a la DB por lo que es necesario verificar y tener un callback cuando se realize.
//esta funcion solo nos manda un error cuando no se completó exitosamente
//podemos saber en que falló por medio de la docuemntacion
tasks.save(function (err){
if (err) {
return res.send.('Task Completed')
}
})
}
})
}
})
}
En resumen, los CallBacks tienen esa configuración para que no se desate la siguiente función si no ha retornado algún valor en la función actual.
De manera que tenemos función dentro de función dentro de función.
Y se hace un código feo a la derecha, y a veces excesivamente largo llamado CallBack to Hell.
Ni modo, vive con ello, o usa promesas.
//callback to hell
function requestHandler(req,res) {
User.findById(req.userId, function(err, user) {
if (err) {
res.send(err)
} else {
Tasks.findById(user.taskId, function(err, task){
if (err) {
return res.send(err)
} else {
tasks.completed = true
tasks.save(function (err){
if (err) {
return res.send.('Task Completed')
}
})
}
})
}
})
}
//paso3 corre la funsion sum
function sum(num1, num2) {
return num1 + num2 //y retorna el resultado
}
//por estandar se usa el tercer parametro como callback
//paso 2 comienza la funcion calc, reciviendo numeros y a sum
function calc(num1, num2, callback) {
return callback(num1, num2) // esto es equivalente a sum(2,2)
}
//paso 1 corre la funcion calc con estos parametros, uno de ellos es la funcion sum
console.log(calc(2, 2, sum)) //paso 4, imprimir
function date(callback) {
console.log(new Date) //#2 primer print
setTimeout(function () {
let date = new Date
callback(date)
}, 3000) //#3 3 segundos
} //#5 fin
function printDate(dateNow) {
console.log(dateNow) //#4 2do print
}
date(printDate)//#1
var dragon = ['goku', 'vegeta', 'picoro', 'gohan']
//forEach es la función
//la función hola es el callback
dragon.forEach(function hola(name, index){
console.log(`${index}. ${name}`)
})