¿Cuál es la diferencia entre la función de devolución de llamada y las promesas en JS y en qué caso tenemos que usarlas?

Una devolución de llamada es una función que se llama al finalizar una operación determinada. Esto evita el bloqueo de código.

Uno de los problemas obvios con las devoluciones de llamada es cuando tienes múltiples operaciones asincrónicas que dependen unas de otras. Por lo tanto, tendrá devoluciones de llamada, anidadas dentro de devoluciones de llamada, anidadas dentro de devoluciones de llamada, etc.

  La función isUserExists (id, devolución de llamada) {
    getDatabase (función (db) {
        getUser (db, 'usuarios', id, función (usuario) {
            var encontrado = (usuario)?  verdadero Falso;
            devolución de llamada (encontrado);
        })
     })
 }

Las promesas, por otro lado, son objetos que representan el resultado de una operación asincrónica.

Utilizan las devoluciones de llamada para proporcionar una forma mejor y más fácil de manejar la operación asincrónica, y resuelven el problema de las devoluciones de llamada anidadas (usando then() ), y el manejo de errores se vuelve menos doloroso (usando .error() y .catch() ).

  La función isUserExists (id) {
     return getDatabase (). then (function (db) {
         return getUser (db, 'usuarios', id);
     }). luego (función (usuario) { 
         volver (usuario)?  verdadero Falso;
     }). catch (función (e) {
        // identificador de error 
     });
 }

 // Ahora podemos obtener el valor resuelto por el objeto de promesa
 // devuelto por el método then () en la función isUserExists ().
 isUserExists.then (function (userExists) {
    // realiza el trabajo de la función callback () en el ejemplo anterior aquí.
 });

 // La promesa
 función getDatabase (datos) {
  return new Promise (función (resolver, rechazar) {
      // realiza cualquier operación asincrónica y comprueba si se devuelve el error
      if (error) rechazar (error);     
      de lo contrario resolver (db);
  });    
 }

Nota: El método then() devuelve una promesa. Si el método del controlador devuelve un valor, la promesa devuelta por then() se resuelve con el valor devuelto como su valor. Y si devuelve una promesa ya resuelta, la promesa devuelta para then() se resuelve con el valor de esa promesa como su valor.

Las devoluciones de llamada son trucos bastante antiguos que se hicieron porque las promesas no se implementaron en ese momento. Nadie pensó que JavaScript explotaría tanto hasta finales de la década de 2000. Las promesas son el camino a seguir para el futuro Javascript, ya que ahora son parte de los estándares ES6. Incluso antes de que se propusiera este estándar, algunas buenas personas implementaron algunos marcos como “q” para replicar las promesas. Por lo tanto, los marcos principales como Angular 1.xy React venían con promesas por defecto. En cualquier caso, si planea escribir algún código en javascript ahora, siempre use promesas.

Para responder a su pregunta original, ambos hacen lo mismo pero un poco diferente. Suponga que tiene que realizar algunas tareas justo después de que se complete su solicitud ajax. Nunca sabremos cuándo su solicitud será exitosa / fallida debido a la latencia de la red y no podemos usar subprocesos porque JS tiene un solo subproceso. Tampoco podemos bloquear el hilo principal ya que hará que el navegador sea inutilizable para el usuario. así que registramos una devolución de llamada / promesa cuando llamamos a la función y vamos a otras tareas y una vez que la tarea se completa, la tarea se realizará después de que se ejecute.