Отлов ошибки JSONP по междоменному запросу - PullRequest
6 голосов
/ 07 февраля 2011

Я использую jQuery.getJSON() для URL (другой домен), который может не существовать. Есть ли способ для меня, чтобы поймать ошибку "Не удалось загрузить ресурс"? Кажется, что try / catch не работает из-за асинхронного характера этого вызова.

Я также не могу использовать jQuery.ajax() "error:". Из документации:

Примечание. Этот обработчик не вызывается для междоменных сценариев и запросов JSONP.

Ответы [ 4 ]

11 голосов
/ 07 февраля 2011

Если у вас есть представление о задержке наихудшего случая успешного возврата результата из удаленной службы, вы можете использовать механизм тайм-аута, чтобы определить, была ли ошибка.

var cbSuccess = false;
$.ajax({
   url: 'http://example.com/.../service.php?callback=?',
   type: 'get',
   dataType: 'json',
   success: function(data) {
              cbSuccess = true;
            }
});
setTimeout(function(){ 
        if(!cbSuccess) { alert("failed"); } 
    }, 2000); // assuming 2sec is the max wait time for results
1 голос
/ 31 августа 2011

Это работает:

j.ajaxSetup({
    "error":function(xhr, ajaxOptions, thrownError) {   

    console.log(thrownError);                           
}});
0 голосов
/ 09 февраля 2011

На что вы жалуетесь, так это на стороне клиента, когда вы пытались загрузить ресурс с сервера.

Это встроенный в браузер браузер, который позволяет клиенту или разработчикам сообщить, чтозагрузка ресурса из интернета не удалась.Это не имеет ничего общего с JavaScript и является ошибкой более низкого уровня, возникающей в HTTP, который перехватывает браузер.

Если вы хотите надеяться на его перехват, вам придется удалить сторонние библиотеки ajax ииметь дело с объектом XMLHTTPRequest на гораздо более низком уровне, даже тогда я сомневаюсь, что вы можете что-либо с этим сделать.или не могут быть доступны.Затем либо прекратите доступ к нему, либо сделайте его доступным.

0 голосов
/ 07 февраля 2011

Отложенные объекты (новые в jQuery 1.5) звучат так, как вы ищете:

jQuery.Deferred, представленный в версии 1.5, представляет собой объект с возможностью цепочки, который может регистрировать множественные обратные вызовы в очереди обратного вызова, вызывать очереди обратного вызова и передавать состояние успеха или сбоя любой синхронной или асинхронной функции.

http://api.jquery.com/category/deferred-object/

EDIT:

У меня нормально работает следующий код:

function jsonError(){
    $("#test").text("error");
}

$.getJSON("json.php",function(data){
    $("#test").text(data.a);
}).fail(jsonError);

json.php выглядит так:

print '{"a":"1"}';

Функция ошибки срабатывает для меня, если путь к json.php неверен или если JSON искажен. Например:

print '{xxx"a":"1"}';
...