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 № 1Twó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]
};
});