Mam prostą funkcję ajax:
function GetJsonData(api) {
return (
$.ajax({
type: "GET",
jsonpCallback: "callback",
url: api,
dataType: "jsonp"
}));
}
a teraz, gdy próbowałem wykonywać wiele takich połączeń:
$.when(
GetJsonData("api"),
GetJsonData("api"),
GetJsonData("api"),
GetJsonData("api"),
GetJsonData("api")
)
.done(function (data1, data2, data3, data4, data5) {
alert("success");
})
.fail(function () {
alert("fail");
});
Za każdym razem, gdy wykonuję połączenia takie jak powyżej, najczęściej otrzymuję alert Nieudany. Tylko czasami otrzymuję alert o sukcesie.
Ale kiedy wykonam nie więcej niż 2 połączenia w tym samym czasie w $., Wtedy będę zawsze otrzymuj powiadomienie o sukcesie.
Czy ktoś może mi pomóc dowiedzieć się, gdzie się mylę w powyższych fragmentach kodu? LUB JA należy użyć innego podejścia, aby powyższa funkcja działała poprawnie.
Odpowiedzi:
2 dla odpowiedzi № 1Problem polega na tym, że zmuszasz jQuery do używania określonej nazwy funkcji zwrotnej JSONP, callback
, z tą opcją:
jsonpCallback: "callback"
Więc jeśli masz pokrywające się wywołania JSONP, jQuery spróbuje użyć podobnie działaj na swojej stronie, aby obsłużyć wynik każdego z nich, i usuń tę funkcję, gdy wykona ona swoją pracę na żądanie. Jest to oczywiście problem, żądania się kolidują.
Usuń tę opcję i pozwól jQuery utworzyć własną nazwę funkcji. Zapewni to, że nazwa funkcji jest unikalna dla każdego żądania.
W komentarzach poniżej powiedziałeś:
Kiedy usuwam parametr jsopCllback, widzę ten błąd w przeglądarce ReferenceError: nie zdefiniowano wywołania zwrotnego
i to, co widzisz, powróci, gdy usuniesz jsonpCallback: "callback"
Argument to:
callback ({"status": 0, "item": 20, "content": [{"new1": 196, "new2": 1, "new3": 2, "new4": "abcd", "new5" : 41, „new6”: „aadsa”,}]}
Oznacza to, że usługa JSONP, z którą rozmawiasz, używa aniestandardowa nazwa argumentu ciągu znaków dla nazwy, która daje wywołanie zwrotne, a więc ignoruje standardową nazwę używaną przez jQuery. Musisz dowiedzieć się, jakiej nazwy argumentu oczekują od nazwy wywołania zwrotnego i użyć jsonp: "argNameTheyUse"
opcja dla ajax
.
Standardowa nazwa argumentu to callback
np .:
http://example.com/getsomething?callback=foo
... oznacza użycie nazwy wywołania zwrotnego foo
. Jednak niektóre interfejsy API używają innego argumentu, takiego jak:
http://example.com/getsomething?mySpecialCallbackArg=foo
Jeśli dzwoniłeś do tego punktu końcowego, potrzebujesz jsonp: "mySpecialCallbackArg"
opcja włączona ajax
.
W dalszych komentarzach mówisz, że nie możesz wskazaćdo dokumentacji API, ponieważ jest ona „prywatna”. „Jeśli jest„ prywatna ”, jak w tym„ jest czymś, co ty lub twoja firma kontrolujecie, to świetnie, naprawcie to, aby szanowało callback
argument łańcucha zapytania i używa go jako nazwy funkcji w odpowiedzi JSONP. Tak ma działać JSONP.
Np. Jeśli prześlesz tę prośbę:
http://example.com/getsomething?callback=foo
... mieć kod generujący użycie odpowiedzi foo
jako nazwa wywołania zwrotnego JSONP:
foo({
"data": "here"
})
Jeśli zapytanie brzmi:
http://example.com/getsomething?callback=bar
Następnie użyj bar
zamiast:
bar({
"data": "here"
})
W ten sposób, gdy wykonujesz wiele nakładających się wywołań, jQuery może nadać każdej z nich unikalną funkcję, a oni nie kończą się nawzajem.
Jeśli z jakiegoś powodu ty żargon zrób to (?!), wtedy będziesz musiał wykonywać połączenia szeregowo (jeden po drugim) zamiast równolegle.
-1 dla odpowiedzi № 2
może się zdarzyć, ponieważ wywołujesz wiele wywołań ajax równolegle, a ajax jest asynchroniczny.