.fail () не удается выполнить, когда запрос ajax не удался [дублировать]

Если вам нужно получить доступ к разному вложенному ключу, не зная его во время кодирования (это будет тривиально для их адресации), вы можете использовать ассемблер нотации массива:

var part1name = someObject['part1']['name'];
var part2quantity = someObject['part2']['qty'];
var part3name1 =  someObject['part3'][0]['name'];

Они эквивалентны точке нотация и может варьироваться во время исполнения, например:

var part = 'part1';
var property = 'name';

var part1name = someObject[part][property];

эквивалентно

var part1name = someObject['part1']['name'];

или

var part1name = someObject.part1.name;

Надеюсь, что этот адрес вопрос ...

EDIT

Я не буду использовать строку, чтобы передать вид запроса xpath для доступа к значению объекта. Поскольку вам нужно вызвать функцию для синтаксического анализа запроса и получить значение, я буду следовать другому пути (не:

var part1name = function(){ return this.part1.name; }
var part2quantity = function() { return this['part2']['qty']; }
var part3name1 =  function() { return this.part3[0]['name'];}

// usage: part1name.apply(someObject);

или, если вам неловко использовать метод apply

var part1name = function(obj){ return obj.part1.name; }
var part2quantity = function(obj) { return obj['part2']['qty']; }
var part3name1 =  function(obj) { return obj.part3[0]['name'];}

// usage: part1name(someObject);

Функции короче, яснее, интерпретатор проверяет их на наличие синтаксических ошибок и т. д.

. Кстати, я чувствую, что простое присваивание выполняется по праву время будет достаточным ...

73
задан Andy May 21 November 2008 в 20:48
поделиться

9 ответов

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

После поиска их трекера ошибок есть патч , который может быть возможным решением с использованием обратного вызова тайм-аута. См. Отчет об ошибке g1] № 3442 . Если вы не можете зафиксировать ошибку, вы можете по крайней мере тайм-аут после ожидания разумного количества времени для успеха.

53
ответ дан Adam Bellaire 24 August 2018 в 00:36
поделиться

Кажется, что сейчас работает:

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});
2
ответ дан alex 24 August 2018 в 00:36
поделиться

Я использую это, чтобы поймать ошибку JSON

try {
   $.getJSON(ajaxURL,callback).ajaxError();
} catch(err) {
   alert("wow");
   alert("Error : "+ err);
}

Изменить: альтернативно вы также можете получить сообщение об ошибке. Это позволит вам точно узнать, что такое ошибка. Попробуйте выполнить следующий синтаксис в блоке catch

alert("Error : " + err);
1
ответ дан Alexander 24 August 2018 в 00:36
поделиться
  • 1
    Как вы можете попробовать / поймать асинхронный вызов? Звонок заканчивается сразу же до попытки try / catch. Обратный вызов или любая ошибка происходит позже после того, как мы покинули область действия этого кода . – Gone Coding 5 June 2013 в 16:54

Я также разместил этот ответ в stackoverflow - Обработка ошибок в вызовах 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");
    }         
});

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

Надеюсь, что это помогает кому-то по-прежнему искать ответ на этот вопрос.

46
ответ дан Community 24 August 2018 в 00:36
поделиться
  • 1
    Я не понимаю, почему у этого нет больше очков. Очевидно, что, как предполагается, обработка ошибок. Почему принятый ответ говорит «Кажется, что запросы JSONP, которые не возвращают успешный результат, никогда не запускают какое-либо событие, успех или неудачу». когда это, очевидно, просто не соответствует действительности ??? Вещи, которые я не понимаю. – Blauhirn 14 October 2015 в 18:43
  • 2
    $(selector).getJSON wut ... – Kevin B 19 January 2018 в 23:49

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

? callback =? & amp; ошибка =?

Это называется JSONPE, но это вовсе не стандарт defacto.

Затем провайдер передает информацию в функцию ошибки, чтобы помочь вам диагностировать.

Не помогает с ошибками в сообщении, хотя - jQuery нужно будет обновить, чтобы также вызвать функцию ошибки при тайм-ауте, как в ответе Адама Беллэра.

3
ответ дан delitescere 24 August 2018 в 00:36
поделиться
  • 1
    К сожалению, это не сработает для ошибки 404. – Matt Burland 10 October 2012 в 20:51

Я знаю, что этот вопрос немного стар, но я не видел ответа, который дает простое решение проблемы, поэтому я решил, что поделюсь своим «простым» решением.

$.getJSON("example.json", function() {
      console.log( "success" );
}).fail(function() { 
      console.log( "error" ); 
}); 

Мы можем просто использовать обратный вызов .fail(), чтобы проверить, произошла ли ошибка.

Надеюсь, это поможет:)

13
ответ дан Farhan Ahmad 24 August 2018 в 00:36
поделиться

вы явно обрабатываете любой номер ошибки, добавляя этот атрибут в запрос 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");
}
});

надеюсь, что это помогает вам:)

0
ответ дан ghost rider3 24 August 2018 в 00:36
поделиться

Возможно, это работает?

.complete(function(response, status) {
    if (response.status == "404")
        alert("404 Error");
    else{
        //Do something
    }   
    if(status == "error")
        alert("Error");
    else{
        //Do something
    }
});

Я не знаю, когда состояние переходит в режим «ошибка». Но я тестировал его с 404, и он ответил

0
ответ дан Marcel 24 August 2018 в 00:36
поделиться
  • 1
    даже мы можем проверить статус ответа на функцию ошибки. Лучше мы можем использовать функцию ошибки. – gviswanathan 20 December 2012 в 07:20

Обнаружение проблем 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 будет вставьте этот тег скрипта в DOM:

<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>

Что происходит, когда тег <script> добавлен в DOM? Очевидно, что он выполняется.

Итак, предположим, что ответ на этот запрос дал результат JSON, такой как:

{"answer":42}

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

<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 секунд, если ваш флаг по-прежнему не установлен, запрос истекает.

15
ответ дан Matt 24 August 2018 в 00:36
поделиться
  • 1
    хороший трюк !!!! – l2aelba 8 November 2012 в 14:55
  • 2
    Вы также можете использовать jsonpFailCheck = setTimeout(...), а затем вместо success=true использовать clearTimeout(jsonpFailCheck) – iancoleman 18 November 2012 в 09:22
Другие вопросы по тегам:

Похожие вопросы: