javascript - Returnează rezultatul promisiunii AJAX cu jQuery


Poate cineva să explice de ce în următorul exemplu, foo() returnează întreaga promisiune în loc de datele propriu-zise? Și cum să facem ca foo() să returneze doar datele?

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

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

console.log(foo())

Mulțumesc!

Răspuns #1

Done returnează întotdeauna promisiunea, nu are sens să returnezi ceva din funcția pe care o furnizezi lui done:

Metoda deferred.done() acceptă unul sau mai mulți argumente, toate putând fi fie o singură funcție, fie un șir de funcții. Când Deferred este rezolvat, callback-urile done sunt apelate. Callback-urile sunt executate în ordinea în care au fost adăugate. Deoarece deferred.done() returnează obiectul deferred, alte metode ale obiectului deferred pot fi legate de aceasta, inclusiv metode .done() suplimentare.\nSursă: https://api.jquery.com/deferred.done/

promise.done(...).done(...) sau promise.done(fn1, fn2) sunt echivalente.

Poți folosi .then dacă vrei să returnezi o nouă promisiune cu o valoare nouă pentru „data”, adică:

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

O utilizare oarecum comună a lui then este de a returna o promisiune nouă, de exemplu:

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