/ / Wiele wywołań Ajax jsonp z jQuery deferred metoda $ .when - jquery, ajax, jsonp

Wiele połączeń Ajax jsonp z jQuery odroczoną metodą $ .when - jquery, ajax, jsonp

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 № 1

Problem 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 callbacknp .:

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.