Búsqueda de sitios web

javascript - Devolver el resultado de la promesa AJAX con jQuery


¿Alguien puede explicar por qué en el siguiente ejemplo, foo() está devolviendo la promesa completa en lugar de solo los datos? ¿Y cómo hacer que foo() devuelva solo los datos?

var foo = function() {
  var promise = $.ajax({
    type: 'POST',
    url: 'http://example.com'
  })

  return promise.done(function(data) {
    return data
  })
}

console.log(foo())

¡Gracias!

Respuesta #1

Done siempre devuelve la promesa, no tiene sentido devolver nada desde la función que proporcionas a done:

El método deferred.done() acepta uno o más argumentos, todos los cuales pueden ser una sola función o un arreglo de funciones. Cuando se resuelve el Deferred, se llaman los doneCallbacks. Los callbacks se ejecutan en el orden en que fueron agregados. Dado que deferred.done() devuelve el objeto Deferred, otros métodos del objeto Deferred se pueden encadenar a este, incluyendo métodos .done() adicionales. Fuente: https://api.jquery.com/deferred.done/

promise.done(...).done(...) o promise.done(fn1, fn2) son equivalentes.

Puedes usar .then si quieres devolver una nueva promesa con un nuevo valor para "data", es decir:

promise.then(function(data1){
  return data1.result;
}).done(function(data2){
  //the value of data2 here will be data1.result 
});

Un uso algo común de then es devolver una nueva promesa, por ejemplo:

promise.then(function(data){
  return $.ajax(...);
}).done(function(resultFromAjaxCall){});