javascript - Returner AJAX-promisens resultat med jQuery


Kan nogen forklare, hvorfor foo() i følgende eksempel returnerer hele løftet i stedet for kun dataene? Og hvordan får man foo() til kun at returnere dataene?

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

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

console.log(foo())

Tak!

Svar #1

Done returnerer altid løftet, det giver ikke mening at returnere noget fra den funktion, som du leverer til done:

Metoden deferred.done() accepterer et eller flere argumenter, som alle kan være enten en enkelt funktion eller et array af funktioner. Når Deferred er løst, kaldes doneCallbacks. Callbacks udføres i den rækkefølge, de blev tilføjet. Da deferred.done() returnerer deferred-objektet, kan andre metoder på deferred-objektet kædes til denne, inklusive yderligere .done()-metoder. Kilde: https://api.jquery.com/deferred.done/

promise.done(...).done(...) eller promise.done(fn1, fn2) er ækvivalente.

Du kan bruge .then, hvis du vil returnere et nyt promise med en ny værdi for "data", altså:

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

En noget almindelig brug af then er at returnere et nyt løfte, for eksempel:

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