Myślę, że ta kwestia wymaga pełniejszego wyjaśnienia.
$.when()
nie ma żadnych magicznych mocy, aby wiedzieć, kiedy dzieje się jakaś funkcja umieszczona w jej parens. Działa tylko z operacjami asynchronicznymi, gdy przekazujesz $.when()
jedną lub więcej obietnic, które same zostaną rozwiązane, gdy wykonywana jest podstawowa operacja asynchroniczna.
Więc w kodzie:
myFunc = function() {
$.getJSON("./rest/api/some/url", function(json, textStatus) {
console.log("AJAX call hit!");
});
};
$.when(myFunc()).then(function() {
console.log("Then block hit!");
});
myFunc()
jest powrocie nic co oznacza undefined
, więc jesteś w istocie robi:
myFunc();
$.when(undefined).then(function() {
console.log("Then block hit!");
});
Jeśli nie przechodzą żadnych obietnic $.when()
, po prostu rozwiązuje się natychmiast (ponieważ nie ma na co czekać).
Zamiast tego należy upewnić się, że myFunc()
zwraca obietnicę rozwiązaną po wykonaniu połączenia z Ajax. Ponieważ jQuery $.getJSON()
już wraca takiej obietnicy, wszystko co musisz zrobić, to zwrócić tę obietnicę takiego:
var myFunc = function() {
return $.getJSON("./rest/api/some/url", function(json, textStatus) {
console.log("AJAX call hit!");
});
};
$.when(myFunc()).then(function() {
console.log("Then block hit!");
});
oczywiście, gdy jest tylko jedna obietnica czekać na, nie ma powodu, aby użyć $.when()
w ogóle, ponieważ jest to tylko dodatkowy kod, który przeszkadza. $.when()
naprawdę dodaje wartość tylko wtedy, gdy masz więcej niż jedną obietnicę, na którą chcesz poczekać. Zamiast tego możesz po prostu zrobić to:
var myFunc = function() {
return $.getJSON("./rest/api/some/url", function(json, textStatus) {
console.log("AJAX call hit!");
});
};
myFunc().then(function() {
console.log("Then block hit!");
});
Nie powinieneś używać '$ .when' na wywołania funkcji, które zwracają obietnice. Wtedy szybko zorientowałeś się, że twoja funkcja nie zwraca obietnicy :-) – Bergi