2015-07-03 17 views
5

Mam Obietnica zdefiniowany jako tak:jQuery Obietnica wtedy nie działa po AJAX

myFunc = function() { 
    $.getJSON("./rest/api/some/url", function(json, textStatus) { 
     console.log("AJAX call hit!"); 
    }); 
}; 


$.when(myFunc()).then(function() { 
    console.log("Then block hit!"); 
}); 

aw konsoli nie jest wysyłany jako:

Then block hit! 
AJAX call hit! 

muszę AJAX call hit! najpierw następuje przez Then block hit!.

Każdy pomysł, dlaczego tak się dzieje? Próbowałem nawet zaimplementować niestandardową funkcję wywołania zwrotnego (standardowy przykład, który znalazłem na Stackoverflow) i nadal nie działa.

+1

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

Odpowiedz

13

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!"); 
}); 
+0

Dodano lepszą metodę, która nie używa nawet '$ .when()', ponieważ nie jest potrzebna, gdy istnieje tylko jedna obietnica. – jfriend00

+0

+1 za stwierdzenie, że nie ma magii w obietnicach :-) – Bergi

1

Musisz obiecać zgodnego obiekt functon myFunc() zwraca null

$.when(null).then(function() { 
    console.log("Then block hit!"); 
}); 

wyjście: Następnie blok hit!

Spróbuj

return $.getJSON("...