Как отображать сообщение об ошибке JSON?

В настоящее время я разрабатываю тему tumblr и создал jQuery JSON thingamabob, который использует Tumblr API для следующих действий:

Пользователь нажимал на ссылку "тип сообщения" (например, сообщения с видео ), на этом этапе jQuery будет использовать JSON для захвата всех сообщений, связанных с этим типом, а затем динамически отображать их в обозначенной области.

Теперь все работает отлично, за исключением того, что из-за того, что Tumblr - это Tumblr, а их серверы время от времени постучали, API Tumblr иногда не работает. Теперь я не могу предвидеть, когда эта функция выйдет из строя, поэтому я хочу отобразить какое-то общее сообщение об ошибке, если JSON (по какой-либо причине) не смог загрузить сообщение.

Вы увидите, что я уже написал некоторый код для отображения сообщения об ошибке, когда jQuery не может найти никаких сообщений, связанных с этим типом сообщения, НО он не охватывает никаких ошибок сервера. Примечание. Иногда я получаю такую ​​ошибку:

Не удалось загрузить ресурс: сервер ответил статусом 503 (служба временно недоступна)

Именно для этого сообщения об ошибке 503 мне нужно написать код, но я ' m слегка невежественен :)

Вот код jQuery JSON:

$('ul.right li').find('a').click(function() {
  var postType = this.className;
  var count = 0;
  byCategory(postType);
  return false;

  function byCategory(postType, callback) {
    $.getJSON('{URL}/api/read/json?type=' + postType + '&callback=?', function(data) {
    var article = [];
     $.each(data.posts, function(i, item) {
     // i = index
     // item = data for a particular post
     switch(item.type) {
     case 'photo':
     article[i] = '
' + 'type_icon' + 'image
'; count = 1; break; case 'video': article[i] = '
' + '' + 'type_icon' + '' + item['video-player'] + '' + '
'; count = 1; break; case 'audio': if (use_IE == true) { article[i] = '
'; } else { article[i] = '
' + 'type_icon' + '

' + item['id3-artist'] +' - ' + item['id3-title'] + '

' + item['audio-player'] + '
' + '
'; }; count = 1; break; case 'regular': article[i] = '
' + 'type_icon

' + item['regular-title'] + '

' + item['regular-body'] + '
'; count = 1; break; case 'quote': article[i] = '
' + 'type_icon

' + item['quote-text'] + '

- ' + item['quote-source'] + '
'; count = 1; break; case 'conversation': article[i] = '
'; count = 1; break; case 'link': article[i] = '
'; count = 1; break; default: alert('No Entries Found.'); }; }) // end each if (!(count == 0)) { $('#content_right') .hide('fast') .html('

Displaying ' + postType + ' Posts Only

' + article.join('')) .slideDown('fast') } else { $('#content_right') .hide('fast') .html('

Hmmm, currently there are no ' + postType + ' posts to display

') .slideDown('fast') } // end getJSON }); // end byCategory } });

Если вы Я хотел бы увидеть демо в действии, ознакомьтесь с Elegantem , но обратите внимание, что все может работать для вас (или нет) абсолютно нормально, в зависимости от темперамента Tumblr.


Обновление

Хорошо, так что после следующий ответ jmorts ниже, как можно ближе к букве, насколько позволяет 2 часа ночи, я безуспешно набрал следующий код - предупреждения не появляется. Мябэ, я кукла, может быть, я просто глупый, но если вы, джедаи, можете еще раз взглянуть, я был бы очень признателен :) s никаких предупреждений не появляется. Мябэ, я кукла, может быть, я просто глупый, но если вы, джедаи, можете еще раз взглянуть, я был бы очень признателен :) s никаких предупреждений не появляется. Мябэ, я кукла, может быть, я просто глупый, но если вы, джедаи, можете еще раз взглянуть, я был бы очень признателен :)

$('ul.right li').find('a').click(function() {
        var postType = this.className;
        var count = 0;
        byCategory(postType);
        return false;

        function byCategory(postType, callback) {
          $.getJSON('{URL}/api/read/json?type=' + postType + '&callback=?', function(data, textStatus, xhr) { // main callback function
          if(xhr.status == 500 || xhr.status == 404 || xhr.status == 503) {
                  yourErrorHandler(data, textStatus, xhr); // success
                } else {
                  yourCallbackToRunIfSuccessful(data);   // failed
                }
              }
        );


        function yourCallbackToRunIfSuccessful(data) {  
          var article = [];
              $.each(data.posts, function(i, item) {
              // i = index
              // item = data for a particular post
              switch(item.type) {
              case 'photo':
              article[i] = '
' + 'type_icon' + 'image
'; count = 1; break; case 'video': article[i] = '
' + '' + 'type_icon' + '' + item['video-player'] + '' + '
'; count = 1; break; case 'audio': if (use_IE == true) { article[i] = '
'; } else { article[i] = '
' + 'type_icon' + '

' + item['id3-artist'] +' - ' + item['id3-title'] + '

' + item['audio-player'] + '
' + '
'; }; count = 1; break; case 'regular': article[i] = '
' + 'type_icon

' + item['regular-title'] + '

' + item['regular-body'] + '
'; count = 1; break; case 'quote': article[i] = '
' + 'type_icon

' + item['quote-text'] + '

- ' + item['quote-source'] + '
'; count = 1; break; case 'conversation': article[i] = '
'; count = 1; break; case 'link': article[i] = '
'; count = 1; break; default: alert('No Entries Found.'); }; }) // end each if (!(count == 0)) { $('#content_right') .hide('fast') .html('

Displaying ' + postType + ' Posts Only

' + article.join('')) .slideDown('fast') } else { $('#content_right') .hide('fast') .html('

Hmmm, currently there are no ' + postType + ' posts to display

') .slideDown('fast') } // end getJSON }; // end byCategory function yourErrorHandler(data,textStatus,xhr) { alert("Server returned status code " + xhr.status + ". Try again later."); } } });

5
задан Tiny Giant Studios 7 January 2011 в 02:15
поделиться