javascript - Pulangkan hasil janji AJAX dengan jQuery


Bolehkah seseorang terangkan mengapa dalam contoh berikut, foo() mengembalikan keseluruhan janji (promise) dan bukannya hanya data? Dan bagaimana untuk membuat foo() mengembalikan hanya data?

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

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

console.log(foo())

Terima kasih!

Jawapan #1

Done sentiasa mengembalikan janji, tidak masuk akal untuk mengembalikan apa-apa dari fungsi yang anda sediakan kepada done:

Kaedah deferred.done() menerima satu atau lebih argumen, yang mana semuanya boleh sama ada satu fungsi atau satu array fungsi. Apabila Deferred diselesaikan, doneCallbacks akan dipanggil. Callback dilaksanakan mengikut urutan ia ditambah. Oleh kerana deferred.done() mengembalikan objek deferred, kaedah lain bagi objek deferred boleh disambungkan kepada kaedah ini, termasuk kaedah .done() tambahan. Sumber: https://api.jquery.com/deferred.done/

promise.done(...).done(...) atau promise.done(fn1, fn2) adalah setara.

Anda boleh menggunakan .then jika anda ingin mengembalikan janji baru dengan nilai baru untuk "data", iaitu:

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

Satu penggunaan 'then' yang agak biasa adalah untuk mengembalikan janji baru, contohnya:

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