Как я могу уловить ошибку jQuery $.getJSON(или $.ajax с типом данных, установленным на "jsonp" ) при использовании JSONP?
Можно ли поймать ошибку при использовании JSONP с jQuery? Я пробовал оба метода $.getJSON и $.ajax, но ни один из них не поймает ошибку 404, которую я тестирую. Вот что я пробовал (имейте в виду, что все они работают успешно, но я хочу обработать случай, когда он не работает):
jQuery.ajax({
type: "GET",
url: handlerURL,
dataType: "jsonp",
success: function(results){
alert("Success!");
},
error: function(XMLHttpRequest, textStatus, errorThrown){
alert("Error");
}
});
А также:
jQuery.getJSON(handlerURL + "&callback=?",
function(jsonResult){
alert("Success!");
});
Я также попытался добавить $.ajaxError, но это тоже не сработало:
jQuery(document).ajaxError(function(event, request, settings){
alert("Error");
});
Заранее благодарим за любые ответы!
Ответы
Ответ 1
Кажется, что запросы JSONP, которые не возвращают успешный результат, никогда не запускают какое-либо событие, успех или неудачу, и к лучшему или худшему, что, по-видимому, по дизайну.
После поиска своего трекера ошибок патч, который может быть возможным решением с использованием обратного вызова тайм-аута. См. отчет об ошибке # 3442. Если вы не можете зафиксировать ошибку, вы можете по крайней мере тайм-аут после ожидания разумного количества времени для успеха.
Ответ 2
Здесь мой обширный ответ на аналогичный вопрос.
Здесь код:
jQuery.getJSON(handlerURL + "&callback=?",
function(jsonResult){
alert("Success!");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });
Ответ 3
Обнаружение проблем JSONP
Если вы не хотите загружать зависимость, вы можете самостоятельно определить состояние ошибки. Это легко.
Вы сможете обнаруживать ошибки JSONP, используя какой-то тайм-аут. Если в течение определенного времени нет действительного ответа, допустим ошибку. Однако ошибка может быть в основном чем-то.
Вот простой способ проверить ошибки. Просто используйте флаг success
:
var success = false;
$.getJSON(url, function(json) {
success = true;
// ... whatever else your callback needs to do ...
});
// Set a 5-second (or however long you want) timeout to check for errors
setTimeout(function() {
if (!success)
{
// Handle error accordingly
alert("Houston, we have a problem.");
}
}, 5000);
Как упоминалось в комментариях thedawnrider, вы также можете использовать clearTimeout:
var errorTimeout = setTimeout(function() {
if (!success)
{
// Handle error accordingly
alert("Houston, we have a problem.");
}
}, 5000);
$.getJSON(url, function(json) {
clearTimeout(errorTimeout);
// ... whatever else your callback needs to do ...
});
Почему? Читайте дальше...
Здесь как JSONP работает в двух словах:
JSONP не использует XMLHttpRequest, как обычные запросы AJAX. Вместо этого он вводит тег <script>
на страницу, где атрибут "src" является URL-адресом запроса. Содержимое ответа завершается функцией Javascript, которая затем выполняется при загрузке.
Например.
Запрос JSONP: https://api.site.com/endpoint?this=that&callback=myFunc
Javascript вставляет этот тег script в DOM:
<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>
Что происходит, когда тег <script>
добавляется в DOM? Очевидно, что он выполняется.
Итак, предположим, что ответ на этот запрос дал результат JSON, например:
{"answer":42}
В браузер, это то же самое, что и источник script, поэтому он запускается. Но что происходит, когда вы выполняете это:
<script>{"answer":42}</script>
Ну, ничего. Это просто объект. Он не сохраняется, сохраняется и ничего не происходит.
Вот почему запросы JSONP завершают свои результаты в функции. Сервер, который должен поддерживать сериализацию JSONP, видит параметр callback
, который вы указали, и вместо этого возвращает это:
myFunc({"answer":42})
Затем это выполняется вместо:
<script>myFunc({"answer":42})</script>
... что гораздо полезнее. Где-то в вашем коде есть глобальная функция, называемая myFunc
:
myFunc(data)
{
alert("The answer to life, the universe, and everything is: " + data.answer);
}
Что это. Это "волшебство" JSONP. Затем, чтобы построить тайм-аут, проверка очень проста, как показано выше. Сделайте запрос и сразу же после этого запустите тайм-аут. Через X секунд, если ваш флаг по-прежнему не установлен, запрос истекает.
Ответ 4
Я знаю, что этот вопрос немного стар, но я не видел ответа, который дает простое решение проблемы, поэтому я решил, что поделюсь своим "простым" решением.
$.getJSON("example.json", function() {
console.log( "success" );
}).fail(function() {
console.log( "error" );
});
Мы можем просто использовать обратный вызов .fail()
, чтобы проверить, произошла ли ошибка.
Надеюсь, что это поможет:)
Ответ 5
Если вы сотрудничаете с поставщиком, вы можете отправить другой параметр строки запроса, являющийся функцией обратного вызова при возникновении ошибки.
? обратный вызов = &? Ошибка =
Это называется JSONPE, но это вовсе не стандарт defacto.
Затем поставщик передает информацию в функцию ошибки, чтобы помочь вам диагностировать.
Не помогает с коммит-ошибками - jQuery нужно будет обновить, чтобы также вызвать функцию ошибки в тайм-ауте, как в ответе Адама Беллэра.
Ответ 6
Кажется, что сейчас работает:
jQuery(document).ajaxError(function(event, request, settings){
alert("Error");
});
Ответ 7
Я использую это, чтобы поймать ошибку JSON
try {
$.getJSON(ajaxURL,callback).ajaxError();
} catch(err) {
alert("wow");
alert("Error : "+ err);
}
Изменить: В качестве альтернативы вы также можете получить сообщение об ошибке. Это позволит вам точно узнать, что такое ошибка. Попробуйте выполнить следующий синтаксис в блоке catch
alert("Error : " + err);
Ответ 8
Майби это работает?
.complete(function(response, status) {
if (response.status == "404")
alert("404 Error");
else{
//Do something
}
if(status == "error")
alert("Error");
else{
//Do something
}
});
Я не знаю, когда состояние переходит в режим "ошибки". Но я протестировал его с 404, и он ответил
Ответ 9
вы явно обрабатываете любой номер ошибки, добавляя этот атрибут в запрос ajax:
statusCode: {
404: function() {
alert("page not found");
}
}
Итак, ваш код должен выглядеть следующим образом:
jQuery.ajax({
type: "GET",
statusCode: {
404: function() {
alert("page not found");
}
},
url: handlerURL,
dataType: "jsonp",
success: function(results){
alert("Success!");
},
error: function(XMLHttpRequest, textStatus, errorThrown){
alert("Error");
}
});
надеюсь, что это поможет вам:)
Ответ 10
Я также отправил этот ответ в стек переполнение - обработка ошибок в вызовах getJSON
Я знаю, что прошло некоторое время, так как кто-то ответил здесь, и плакат, вероятно, уже получил ответ отсюда или откуда-то еще. Однако я считаю, что этот пост поможет любому, кто ищет способ отслеживать ошибки и таймауты при выполнении запросов getJSON. Поэтому ниже моего ответа на вопрос
Структура getJSON выглядит следующим образом (найдено на http://api.jqueri.com)
$(selector).getJSON(url,data,success(data,status,xhr))
большинство людей реализует это с помощью
$.getJSON(url, datatosend, function(data){
//do something with the data
});
где они используют url var для предоставления ссылки на данные JSON, datatosend как место для добавления "?callback=?"
и других переменных, которые необходимо отправить, чтобы получить правильные данные JSON, и функцию успеха как функция для обработки данных.
Однако вы можете добавить статус и переменные xhr в свою функцию успеха. Переменная состояния содержит одну из следующих строк: "success", "notmodified", "error", "timeout" или "parsererror", а переменная xhr содержит возвращаемый объект XMLHttpRequest
(найдена в w3schools)
$.getJSON(url, datatosend, function(data, status, xhr){
if (status == "success"){
//do something with the data
}else if (status == "timeout"){
alert("Something is wrong with the connection");
}else if (status == "error" || status == "parsererror" ){
alert("An error occured");
}else{
alert("datatosend did not change");
}
});
Таким образом, легко отслеживать таймауты и ошибки, не создавая пользовательский трекер времени, который запускается после выполнения запроса.
Надеюсь, это поможет кому-то еще найти ответ на этот вопрос.