2011-02-07 1 views
6

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

Нельзя использовать jQuery.ajax() «error:». Из документа:

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

+0

Пожалуйста, проверьте: Ошибка, вероятно, не * выбрасываются * сама по себе, а просто появляется в консоли (только тогда, когда вы открываете консоль). –

+2

Я вижу это, когда консоль Chrome открыта или эквивалентна в других браузерах.Когда инструменты разработчика закрыты, эта ошибка не работает. Это приводит к тому, что а) нет способа заблокировать это, и б) я не должен беспокоиться об этом? –

ответ

-2

Отсроченные объекты (новые в JQuery 1.5) звук, как именно то, что вы ищете:

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

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"}'; 
+2

Не совсем. Defferreds - общий механизм синхронизации результатов асинхронных операций. Проблема OPs заключается в обнаружении сбоя запроса JSONP. –

+0

Это выглядело многообещающим. Я незнаком с этим и, возможно, делаю это неправильно, но это не работает: $ .getJSON («http://www.bogus.com/&callback=?») .fail (function() {}); –

+0

Я обновил свой ответ с помощью некоторого кода. –

11

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

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 
+0

Спасибо за ваш ответ. Это все равно приведет к ошибке «Ошибка при загрузке ресурса», что я пытаюсь остановить. –

+2

+1 Тайм-аут - единственный путь (с начала 2011 года). –

+4

@Matthew Simoneau: Эта ошибка получается * зарегистрирована *, а не * брошена *. Вы не можете предотвратить эту ошибку при входе в консоль. –

-6

Что вы жалуетесь на ошибку на стороне клиента, говоря, что вы пытались загрузить ресурс с сервера.

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

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

В основном, когда вы видите эту ошибку, узнайте, какой объект вы пытаетесь получить, чего не существует или не удалось получить. Затем либо прекратите доступ к нему, либо сделайте его доступным.

+5

Первые два абзаца велики. В-третьих, это совершенно неправильно. JSONP - это другое животное. Но с обычным файлом .ajax вы можете использовать отложенный объект для обработки ошибок гораздо более элегантно, чем использование непосредственно с XMLHTTPRequest. –

+0

@rpflo meh XMLHttpRequest более изящный, чем '.ajax' и отложенные. Однако покажите мне пример, где вы можете поймать эту «ошибку» с помощью jQuery. – Raynos

1

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

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

    console.log(thrownError);       
}}); 
+1

Вы уверены? Междоменные/JSONP-вызовы не используют XHR, они используют инъекцию скрипта. (По крайней мере, в этом случае, когда CORS не рассматривается.) – hippietrail

 Смежные вопросы

  • Нет связанных вопросов^_^