Ricknmorty callback to Hell

//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}`)
})