Обработка ошибок в запросах JSONP

Я делаю AJAX-запрос JSONP, но обработка ошибок не будет работать. Если запрос 404 или 500, он не обработает ошибку.

Я искал ответ, чтобы найти ответ на этот вопрос, но ничего не могу найти. Кажется, есть решение сhttp://code.google.com/p/jquery-jsonp/, но я не могу найти примеры того, как его использовать.

function authenticate(user, pass) {       
    $.ajax ({
        type: "POST",
        url: "url",
        dataType: 'jsonp',
        async: false,
        //json object to sent to the authentication url
        data: {"u": userid, "p": pass},

        success: function (data) {
            //successful authentication here
            console.log(data);
        },
        error: function(XHR, textStatus, errorThrown) {
            alert("error: " + textStatus);
            alert("error: " + errorThrown);
        }
    })
}

Ответы на вопрос(5)

Решение Вопроса

Для междоменных запросов JSONP нет обработки ошибок. Используйте плагин jsonp, доступный на Githubhttps://github.com/jaubourg/jquery-jsonp это обеспечивает поддержку для обработки ошибок.

JQuery ajax Timeout - Тайм-аут после разумного промежутка времени для запуска обратного вызова ошибки, потому что он мог молча завершиться с ошибкой. Вы можете не знать, что именно было (или статус ошибки), но, по крайней мере, вы можете ее обработать

 claws23 мар. 2014 г., 23:26
Способ 2 продемонстрирован в ответе ниже:stackoverflow.com/a/19185826/193653
 SweetWisher ツ21 февр. 2014 г., 09:10
Можете ли вы показать демо-код, чтобы сделать вызов AJAX с помощью этого плагина ???

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

function authenticate(user, pass) {
    var ajax = ($.jsonp || $.ajax)({
        'url': /* your auth url */,
        'data': { /* user, pass, ... */ },
        'contentType': "application/javascript",
        'dataType': 'jsonp',
        'callbackParameter': 'callback'  // $.jsonp only; $.ajax uses 'jsonpCallback'
    });
    ajax.done(function (data) {
        // your success events
    });
    ajax.fail(function (jqXHR, textStatus, errorThrown) {
        // $.jsonp calls this func as function (jqXHR, textStatus)
        // and $.ajax calls this func with the given signature
        console.error('AJAX / JSONP ' + textStatus + ': ' +
            (errorThrown || jqXHR.url));
    });
}

Поскольку jquery-jsonp и $ .ajax поддерживают спецификацию jQuery Deferred, мы можем объединить два обработчика ошибок, обрабатывая ошибки серий 400 и 500, а также тайм-ауты поиска.

как и вы, боролся с ошибками в запросах ajax jsonp DataType, однако хочу поделиться с вами своим кодом, надеюсь, это поможет. Основным является включение таймаута в запрос ajax, иначе он никогда не введет ошибку: функция

$.ajax({
url: "google.com/api/doesnotexists",
dataType: "jsonp",
timeout: 5000,

success: function (parsed_json) {
console.log(parsed_json);
},

error: function (parsedjson, textStatus, errorThrown) {
console.log("parsedJson: " + JSON.stringify(parsedjson));

$('body').append(
    "parsedJson status: " + parsedjson.status + '</br>' + 
    "errorStatus: " + textStatus + '</br>' + 
    "errorThrown: " + errorThrown);        

 }
});

jsfiddle - обрабатывает ошибки с помощью jquery ajax-вызова и JSONP dataType - ошибка 404

 Mig25 мар. 2015 г., 11:55
Глядя на это, изначально кажется, что он работает, но, к сожалению, использование «google.com/api/doesnotexists» сделает запрос jQueryhttp://fiddle.jshell.net/_display/google.com, вместоgoogle.com, Если вы префикс URL сhttp вы увидите правильное поведение, при котором наблюдается тайм-аут и статус не возвращается.
 Don 0100110022 мая 2015 г., 20:56
Проголосовал, потому что я подтвердил то, что сообщает @Mig; Запрошенный URL неверен в этом примере.
 Great Big Al28 апр. 2016 г., 10:03
Хороший пример, это сработало для меня, понизить голосование из-за псевдо-URL? действительно!

но у меня была такая же проблема. Вот решение, которое сработало для меня.

если тысвоя домен, на который вы отправляете запрос, вы можете установить переменную в ответе и проверить его на стороне клиента.

Сторона сервера:

SERVER_RESPONSE=true; Callback(parameter1, parameter2);

Сторона клиента:

if(typeof SERVER_RESPONSE === 'undefined'){
  console.log('No Response, maybe server is down');
}
else{
  console.log('Got a server response');
}

Документация по jQuery.ajax (), ты можешь найти:

ошибка

Функция, вызываемая в случае сбоя запроса (...)Запись: Этот обработчикне вызывается для междоменных сценариев и междоменных запросов JSONP. Это Ajax Event.

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

$.ajax({
    ...
    timeout: 5000, // a lot of time for the request to be successfully completed
    ...
    error: function(x, t, m) {
        if(t==="timeout") {
            // something went wrong (handle it)
        }
    }

});

Другие проблемы в вашем коде ...

ПокаJSONP (смотрюВот а такжеВот) можно использовать для преодоления ограничения политики источника, вы не можете POST использовать JSONP (см.CORS вместо) потому что это простоне работает таким образом - он создает элемент для выборки данных, который должен быть выполнен с помощью запроса GET. Решение JSONP не использует объект XmlHttpRequest, поэтому это не AJAX-запрос в стандартном понимании, но к контенту по-прежнему обращаются динамически - без разницы для конечного пользователя.

$.ajax({
    url: url,
    type: "GET"
    dataType: "jsonp",
    ...

Во-вторых, вы предоставляете данные неправильно. Вы помещаете объект javascript (созданный с использованием литералов объекта) на провод вместо его сериализованного представления JSON. Создать строку JSON (не вручную, используйте, например,JSON.stringify конвертер):

$.ajax({
    ...
    data: JSON.stringify({u: userid, p: pass}),
    ...

Последний выпуск, который вы установилиasync вfalseв то время как документация говорит:

Междоменные запросы и dataType: запросы «jsonp» не поддерживают синхронную работу.

 devwannabe11 сент. 2015 г., 15:23
Тим МакКлюр. То, что сказал Тим Маклур, является правдой, и я искал в Интернете более 2 дней, пытаясь найти решение о том, как обрабатывать «Uncaught TypeError: jQuery110203912213369484832883_193467225 не является функцией». Try-catch не захватывает это. Я завернул свой звонок в $ .ajax, но не повезло.
 Tim McClure09 июл. 2015 г., 14:51
Просто хочу добавить, что документация AJAX, на которую есть ссылка в ответе выше, также указывается подtimeout параметр:In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period.

Ваш ответ на вопрос