2011-01-07 8 views
5

Ich entwickle derzeit ein Thema tumblr und habe eine jQuery JSON thingamabob gebaut, die das Tumblr-API verwendet die folgenden Funktionen ausführen:Wie wird eine JSON-Fehlermeldung angezeigt?

Der Benutzer auf dem „post-Typ“ Link (zB Video Beiträge) klicken würde, bei denen stage jQuery verwendet JSON, um alle mit diesem Typ verknüpften Posts abzurufen und sie dann dynamisch in einem bestimmten Bereich anzuzeigen.

Jetzt funktioniert alles absolut peachy, außer dass Tumblr Tumblr ist und ihre Server hin und wieder klopfen, das Tumblr API-Ding ist manchmal offline. Jetzt kann ich nicht vorhersehen, wann diese Funktion ausfällt, weshalb ich eine generische Fehlermeldung anzeigen möchte, wenn JSON (aus welchem ​​Grund auch immer) den Beitrag nicht laden konnte.

Sie werden sehen, dass ich bereits Code geschrieben habe, um eine Fehlermeldung anzuzeigen, wenn jQuery keine Beiträge zu diesem Beitragstyp finden kann, ABER keine Serverfehler. Hinweis: ich manchmal diese Fehlermeldung erhalten:

fehlgeschlagen Ressource laden: der Server mit einem Status von 503 geantwortet (Dienst vorübergehend nicht verfügbar)

Es ist für diese 503 Fehlermeldung ist, die ich brauche einen Code zu schreiben , aber ich bin ein wenig ratlos :)

Hier ist die jQuery JSON-Code ist:

$('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] = '<div class="post_wrap"><div class="photo" style="padding-bottom:5px;">' 
     + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/XSTldh6ds/photo_icon.png" alt="type_icon"/></a>' 
     + '<a href="' + item.url + '" title="{Title}"><img src="' 
     + item['photo-url-500'] 
     + '"alt="image" /></a></div></div>'; 
    count = 1; 
    break; 
    case 'video': 
    article[i] = '<div class="post_wrap"><div class="video" style="padding-bottom:5px;">' 
     + '<a href="' + item.url + '" title="{Title}" class="type_icon">' 
     + '<img src="http://static.tumblr.com/ewjv7ap/nuSldhclv/video_icon.png" alt="type_icon"/></a>' 
     + '<span style="margin: auto;">' 
     + item['video-player'] 
     + '</span>' 
     + '</div></div>'; 
    count = 1; 
    break; 
    case 'audio': 
    if (use_IE == true) { 
    article[i] = '<div class="post_wrap"><div class="regular">' 
      + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/R50ldh5uj/audio_icon.png" alt="type_icon"/></a>' 
     + '<h3><a href="' 
     + item.url 
     + '">' 
     + item['id3-artist'] 
     +' - ' 
     + item['id3-title'] 
     + '</a></h3>' 
     + '</div></div>'; 

    } else { 
    article[i] = '<div class="post_wrap"><div class="regular">' 
      + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/R50ldh5uj/audio_icon.png" alt="type_icon"/></a>' 
     + '<h3><a href="' 
     + item.url 
     + '">' 
     + item['id3-artist'] 
     +' - ' 
     + item['id3-title'] 
     + '</a></h3><div class="player">' 
     + item['audio-player'] 
     + '</div>' 
     + '</div></div>'; 
    }; 
    count = 1; 
    break; 
    case 'regular': 
    article[i] = '<div class="post_wrap"><div class="regular">' 
     + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/dwxldhck1/regular_icon.png" alt="type_icon"/></a><h3><a href="' 
     + item.url 
     + '">' 
     + item['regular-title'] 
     + '</a></h3><div class="description_container">' 
     + item['regular-body'] 
     + '</div></div></div>'; 
    count = 1; 
    break; 
    case 'quote': 
    article[i] = '<div class="post_wrap"><div class="quote">' 
     + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/loEldhcpr/quote_icon.png" alt="type_icon"/></a><blockquote><h3><a href="' + item.url + '" title="{Title}">' 
     + item['quote-text'] 
     + '</a></h3></blockquote><cite>- ' 
     + item['quote-source'] 
     + '</cite></div></div>'; 
    count = 1; 
    break; 
    case 'conversation': 
    article[i] = '<div class="post_wrap"><div class="chat">' 
     + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/MVuldhcth/conversation_icon.png" alt="type_icon"/></a><h3><a href="' 
     + item.url 
     + '">' 
     + item['conversation-title'] 
     + '</a></h3></div></div>'; 
    count = 1; 
    break; 
    case 'link': 
    article[i] = '<div class="post_wrap"><div class="link">' 
     + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/EQGldhc30/link_icon.png" alt="type_icon"/></a><h3><a href="' 
     + item['link-url'] 
     + '" target="_blank">' 
     + item['link-text'] 
     + '</a></h3></div></div>'; 
    count = 1; 
    break; 
    default: 
    alert('No Entries Found.'); 
    }; 
    }) // end each 

    if (!(count == 0)) { 
    $('#content_right') 
     .hide('fast') 
     .html('<div class="first_div"><span class="left_corner"></span><span class="right_corner"></span><h2>Displaying ' 
     + postType 
     + ' Posts Only</h2></div>' 
     + article.join('')) 
    .slideDown('fast') 
    } else { 
    $('#content_right') 
    .hide('fast') 
    .html('<div class="first_div"><span class="left_corner"></span><span class="right_corner"></span><h2>Hmmm, currently there are no ' 
     + postType 
     + ' posts to display</h2></div>') 
    .slideDown('fast') 
    } 


    // end getJSON 
    }); // end byCategory 
    } 
}); 

Wenn Sie die Demo in Aktion sehen möchten, Elegantem überprüfen aber beachten Sie, dass je Alles kann absolut gut für dich funktionieren (oder auch nicht), abhängig von Tumblrs Temperament.


aktualisiert Okay, also nach folgenden jmorts unter möglichst nahe an den Brief beantworten 02.00 erlaubt, ich habe den folgenden Code ohne Erfolg aufgewühlt - es gibt keine Warnung auftauchen. MYABE Ich bin ein Muppet, vielleicht bin ich nur scheleeeepy aber wenn Sie jedi Leute einen anderen flüchtigen Blick nehmen kann ich würde wirklich zu schätzen :)

$('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] = '<div class="post_wrap"><div class="photo" style="padding-bottom:5px;">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/XSTldh6ds/photo_icon.png" alt="type_icon"/></a>' 
          + '<a href="' + item.url + '" title="{Title}"><img src="' 
          + item['photo-url-500'] 
          + '"alt="image" /></a></div></div>'; 
       count = 1; 
       break; 
       case 'video': 
       article[i] = '<div class="post_wrap"><div class="video" style="padding-bottom:5px;">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon">' 
          + '<img src="http://static.tumblr.com/ewjv7ap/nuSldhclv/video_icon.png" alt="type_icon"/></a>' 
          + '<span style="margin: auto;">' 
          + item['video-player'] 
          + '</span>' 
          + '</div></div>'; 
       count = 1; 
       break; 
       case 'audio': 
       if (use_IE == true) { 
       article[i] = '<div class="post_wrap"><div class="regular">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/R50ldh5uj/audio_icon.png" alt="type_icon"/></a>' 
          + '<h3><a href="' 
          + item.url 
          + '">' 
          + item['id3-artist'] 
          +' - ' 
          + item['id3-title'] 
          + '</a></h3>' 
          + '</div></div>'; 

       } else { 
       article[i] = '<div class="post_wrap"><div class="regular">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/R50ldh5uj/audio_icon.png" alt="type_icon"/></a>' 
          + '<h3><a href="' 
          + item.url 
          + '">' 
          + item['id3-artist'] 
          +' - ' 
          + item['id3-title'] 
          + '</a></h3><div class="player">' 
          + item['audio-player'] 
          + '</div>' 
          + '</div></div>'; 
       }; 
       count = 1; 
       break; 
       case 'regular': 
       article[i] = '<div class="post_wrap"><div class="regular">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/dwxldhck1/regular_icon.png" alt="type_icon"/></a><h3><a href="' 
          + item.url 
          + '">' 
          + item['regular-title'] 
          + '</a></h3><div class="description_container">' 
          + item['regular-body'] 
          + '</div></div></div>'; 
       count = 1; 
       break; 
       case 'quote': 
       article[i] = '<div class="post_wrap"><div class="quote">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/loEldhcpr/quote_icon.png" alt="type_icon"/></a><blockquote><h3><a href="' + item.url + '" title="{Title}">' 
          + item['quote-text'] 
          + '</a></h3></blockquote><cite>- ' 
          + item['quote-source'] 
          + '</cite></div></div>'; 
       count = 1; 
       break; 
       case 'conversation': 
       article[i] = '<div class="post_wrap"><div class="chat">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/MVuldhcth/conversation_icon.png" alt="type_icon"/></a><h3><a href="' 
          + item.url 
          + '">' 
          + item['conversation-title'] 
          + '</a></h3></div></div>'; 
       count = 1; 
       break; 
       case 'link': 
       article[i] = '<div class="post_wrap"><div class="link">' 
          + '<a href="' + item.url + '" title="{Title}" class="type_icon"><img src="http://static.tumblr.com/ewjv7ap/EQGldhc30/link_icon.png" alt="type_icon"/></a><h3><a href="' 
          + item['link-url'] 
          + '" target="_blank">' 
          + item['link-text'] 
          + '</a></h3></div></div>'; 
       count = 1; 
       break; 
       default: 
       alert('No Entries Found.'); 
       }; 
       }) // end each 

       if (!(count == 0)) { 
       $('#content_right') 
       .hide('fast') 
       .html('<div class="first_div"><span class="left_corner"></span><span class="right_corner"></span><h2>Displaying ' 
        + postType 
        + ' Posts Only</h2></div>' 
        + article.join('')) 
       .slideDown('fast') 
       } else { 
        $('#content_right') 
        .hide('fast') 
        .html('<div class="first_div"><span class="left_corner"></span><span class="right_corner"></span><h2>Hmmm, currently there are no ' 
         + postType 
         + ' posts to display</h2></div>') 
        .slideDown('fast') 
       } 


       // end getJSON 
      }; // end byCategory 

      function yourErrorHandler(data,textStatus,xhr) { 
       alert("Server returned status code " + xhr.status + ". Try again later."); 
      } 
     } 
    }); 
+0

Beachten Sie, dass JSON ist die Schreibweise von JavaScript-Objekte, kein Weg, um Daten anzufordern: Mehr Details finden Sie hier. Sie können Ihre Frage ändern, um über AJAX statt JSON zu sprechen, da JSON in dieser Frage nicht wichtig ist. –

+0

Ich glaube, du hast missverstanden, was JSON ist. JSON ist ein Datenrepräsentationsformat; Sie beziehen sich wahrscheinlich auf XmlHttpRequest (allgemein bekannt als "AJAX" aus irgendeinem Grund). –

+0

@Time Machine - Guter Punkt. JSON ist nur ein Datentransport, wie XML. AJAX hingegen ist eine Technik zum Abrufen von Daten von einem Server ohne Neuladen der Seite und kann Daten in XML, JSON, HTML, Nur-Text und anderen Formaten zurückgeben, obwohl das "X" in AJAX für "XML" steht. . – jmort253

Antwort

6

Ihr Rückruf tatsächlich dauert zwei weitere Parameter Sie nicht zeigen:

Sie können das xhr-Objekt verwenden, um den Status des XMLHttpRequest-Rohobjekts zu überprüfen. Wenn Sie eine 404, 503, 500 usw. erhalten, können Sie Ihre Fehlermeldung anzeigen oder Ihre alternative Funktion ausführen.

http://api.jquery.com/jQuery.ajax

Auch, wenn Sie nicht bereits Firebug für den Firefox haben, würde ich empfehlen es für JavaScript-Debugging hoch: http://getfirebug.com/

UPDATE:

Die getJSON JQuery AJAX-Wrapper hat keinen Fehler Callback-Handler. Stattdessen müssen Sie den regulären JQuery AJAX-Handler verwenden, um Ihre JSON Anfrage zu machen:

jQuery.ajax({ 
    type: "GET", 
    url: '{URL}/api/read/json?type=' + postType + 
      '&callback=?', 
    dataType: "json", 
    success: function(results){ 
     console.info("Success!"); 
     yourCallbackToRunIfSuccessful(results); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown){ 
     alert("Error"); 
     yourErrorHandler(XMLHttpRequest, textStatus, errorThrown); 
    } 
    }); 

Es ist wichtig zu beachten, dass dies nicht JSONP ist. Das bedeutet, dass Sie mit dieser Funktion keine domänenübergreifenden Anforderungen erstellen können.

Wenn Sie auf JSONP mit meiner ursprünglichen Antwort angewiesen sind, müssen Sie eine Lösung implementieren, bei der Sie ein setInterval-Ereignis festlegen, um einen Wert abzurufen, der in Ihrem Rückruf geändert wird.

http://groups.google.com/group/jquery-dev/browse_thread/thread/73ca6be8071479fb

+0

Hi jmort, danke für die schnelle Antwort - auf die Gefahr hin, lächerlich unerfahren zu klingen, muss ich sagen, dass mein Kontakt zu JSON und ähnlichem extrem begrenzt ist. Würde es Ihnen etwas ausmachen, wenn ich nach Code frage, da ich noch nie mit XMLHttpRequests gearbeitet habe? Hacken Sie sogar einen Link oder zwei, nur um mich in die richtige Richtung zu zeigen wäre toll :) - Auf einer Nebenbemerkung, vielen Dank dafür, dass Sie sich die Zeit genommen haben, unsere Frage zu bewerten, es ist definitiv geschätzt ... –

+0

Eigentlich bist du nicht weit entfernt. Sie sollten den gesamten Code in der anonymen Funktion nach dieser Zeile & Callback =? 'Nehmen und in eine Funktion namens "yourCallbackToRunIfSuccessful" einfügen. Ersetzen Sie dann Ihren ursprünglichen Rückruf durch meinen, der xhr.status überprüft, um zu sehen, wie der Antwortcode lautet. Ich werde eine weitere Klärung vornehmen. – jmort253

+0

Bitte lassen Sie uns wissen, ob dies für Sie funktioniert. – jmort253