/ / jQuery obietnice i zależne wywołania AJAX - javascript, jquery, ajax, promise, jquery-deferred

jQuery obiecuje i zależne wywołania AJAX - javascript, jquery, ajax, promise, jquery-deferred

Chciałbym wiedzieć, jak wykonywać zależne wywołania AJAX przy użyciu obietnic / odroczeń z jQuery. Teraz mam coś takiego:

$.when($.ajax("https://somedomain.com/getuserinfo/results.jsonp", {
dataType      : "jsonp",
jsonp         : true,
jsonpCallback : "userCallback"
}))
.then(function (data) {
return $.when($.getJSON("http://www.otherdomain.com/user/" + data.userId), $.getJSON("http://www.anotherdomain/user").then(function (json1, json2) {
return {
json1  : json1,
json2  : json2
};
});
});

Działa dla mnie zgodnie z oczekiwaniami, ale nie wiem, czy jest to właściwy sposób. Czy masz jakieś sugestie, jak to poprawić?

Odpowiedzi:

1 dla odpowiedzi № 1

Twój kod już działa ”poprawny”, choć jest kilka rzeczy do poprawy:

$.when($.ajax(…))

Nie potrzebujesz $.when tutaj, $.ajax już zwraca obietnicę.

$.when($.getJSON(…), $.getJSON(…).then(…)

Gdzieś tutaj brakuje nawiasu zamykającego - prawdopodobnie przed .then. Przy założeniu, że:

….then(function(…){ return ….then(function(…){…}); })

Ponieważ obietnice są monadyczne, możesz unnest te wywołania zwrotne do

…
.then(function(…){ return …; })
.then(function(…){…})

aby uniknąć piramidy zagłady.


Specyficzne dla jQuery:

$.when(…).then(function (json1, json2) {
return {
json1: json1,
json2: json2
};
});

Argumenty wywołania zwrotnego po pliku $.when nie są zwykłe wyniki, ale arguments obiekty każdego getJSON odroczona rezolucja. Prawdopodobnie chcesz tylko JSON, który znajduje się na pierwszym indeksie:

$.when(…).then(function (json1, json2) {
return {
json1: json1[0],
json2: json2[0]
};
});