2011-01-07 21 views
5

मैं वर्तमान में एक Tumblr विषय विकासशील रहा हूँ और एक jQuery JSON thingamabob निम्न करने के लिए Tumblr एपीआई का उपयोग करता है का निर्माण किया है:JSON त्रुटि संदेश कैसे प्रदर्शित करें?

उपयोगकर्ता, जिस पर "पोस्ट प्रकार" लिंक (जैसे वीडियो पोस्ट), पर क्लिक करेंगे चरण jQuery जेएसओएन का उपयोग उस प्रकार से संबंधित सभी पदों को पकड़ने के लिए करेगा और फिर गतिशील रूप से उन्हें निर्दिष्ट क्षेत्र में प्रदर्शित करेगा।

अब सब कुछ पूरी तरह से आड़ू का काम करता है, उस के साथ Tumblr Tumblr जा रहा है और अपने सर्वर लेने एक अब और फिर हर दस्तक, Tumblr एपीआई thingy कभी कभी ऑफ़लाइन है छोड़कर। अब जब मैं इस समारोह को कम कर दूंगा, तो मैं पूर्ववत नहीं कर सकता, इसलिए मैं जेएसओएन (जो भी कारण से) पोस्ट लोड करने में असमर्थ था, तो मैं कुछ सामान्य त्रुटि संदेश प्रदर्शित करना चाहता हूं।

आप देखेंगे कि मैंने पहले से ही एक त्रुटि संदेश दिखाने के लिए कुछ कोड लिखा है जब jQuery उस पोस्ट प्रकार से संबंधित कोई भी पोस्ट नहीं ढूंढ सकता है लेकिन इसमें किसी भी सर्वर त्रुटियों को शामिल नहीं किया गया है। नोट: मैं कभी कभी यह त्रुटि प्राप्त:

संसाधन लोड करने में असफल: सर्वर (अस्थायी रूप से अनुपलब्ध सेवा) 503 की स्थिति के साथ प्रतिक्रिया व्यक्त की

यह इस 503 त्रुटि संदेश है कि मैं कुछ कोड लिखने की ज़रूरत के लिए है

$('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 
    } 
}); 

आप कार्रवाई में प्रदर्शन को देखने के लिए चाहते हैं, तो बाहर Elegantem जाँच लेकिन यह है कि कभी टिप्पणी करते हैं:, लेकिन मैं थोड़ा जानकारी नहीं :)

यहाँ jQuery JSON कोड है कर रहा हूँ टंबलर के स्वभाव के आधार पर, ything आपके लिए बिल्कुल ठीक काम कर सकता है (या नहीं)।


अद्यतन ठीक है, तो निम्न jmorts नीचे उत्तर देने के बाद पत्र के रूप में पास के रूप में 02:00 की अनुमति देता है, मैं सफलता के बिना निम्नलिखित कोड बाहर मंथन किया है - वहाँ कोई ऊपर पॉपिंग चेतावनी है। Myabe मैं एक मपेट हूँ, शायद मैं सिर्फ scheleeeepy हूँ लेकिन अगर आप जेडी लोगों एक और झांकना मैं था ले जा सकते हैं वास्तव में इसे :) सराहना

$('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

ध्यान दें कि JSON जावास्क्रिप्ट वस्तुओं की अंकन, नहीं डेटा का अनुरोध करने का एक तरीका है। आप JSON के बजाय AJAX के बारे में बात करने के लिए अपना प्रश्न बदल सकते हैं, क्योंकि इस प्रश्न में JSON महत्वपूर्ण नहीं है। –

+0

मुझे लगता है कि आपने जेएसओएन क्या गलत समझा है। जेएसओएन एक डेटा प्रतिनिधित्व प्रारूप है; आप शायद XmlHttpRequest (आमतौर पर किसी कारण से "AJAX" के रूप में जाना जाता है) का जिक्र कर रहे हैं। –

+0

@ टाइम मशीन - अच्छा बिंदु। जेएसओएन एक्सएमएल की तरह सिर्फ एक डाटा ट्रांसपोर्ट है। जबकि AJAX पृष्ठ को पुनः लोड किए बिना किसी सर्वर से डेटा पुनर्प्राप्त करने के लिए एक तकनीक है, और एक्सएमएल, जेएसओएन, एचटीएमएल, सादा पाठ, और अन्य प्रारूपों में डेटा वापस कर सकता है, इस तथ्य के बावजूद कि AJAX में 'एक्स' 'एक्सएमएल' है । – jmort253

उत्तर

6

आपका कॉलबैक वास्तव में 2 अन्य पैरामीटर आप नहीं दिखा रहे हैं लेता है:

 $.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 
       } 
       } 
     ); 

     // your original code, but wrapped up in it's own function definition 
     function yourCallbackToRunIfSuccessful(data) { 
     var article = []; 
     $.each(data.posts, function(i, item) { 
     // i = index 
     // item = data for a particular post 
     switch(item.type) { 
      case 'photo': 
      ... 
      ... 
     } 

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

आप कच्चे XMLHttpRequest ऑब्जेक्ट की स्थिति की जांच करने के लिए xhr ऑब्जेक्ट का उपयोग कर सकते हैं। यदि आपको 404, 503, 500, आदि मिलते हैं तो आप अपना त्रुटि संदेश प्रदर्शित कर सकते हैं या अपना वैकल्पिक फ़ंक्शन चला सकते हैं।

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

इसके अलावा

, अगर आप पहले से ही Firefox के लिए Firebug की जरूरत नहीं है, मैं अत्यधिक जावास्क्रिप्ट डीबगिंग के लिए यह सलाह देते हैं: http://getfirebug.com/

अद्यतन:

getJSON JQuery AJAX के आवरण त्रुटि कॉलबैक हैंडलर नहीं है। इसके बजाय, आप अपने JSON अनुरोध करने के लिए नियमित रूप से JQuery AJAX हैंडलर का उपयोग करना होगा:

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); 
    } 
    }); 

यह ध्यान रखें कि इस JSONP नहीं है महत्वपूर्ण है। इसका मतलब है कि आप इस फ़ंक्शन का उपयोग करके क्रॉस-डोमेन अनुरोध नहीं कर सकते हैं।

यदि आप मेरे मूल उत्तर का उपयोग कर JSONP पर भरोसा कर रहे हैं, तो आपको एक समाधान लागू करने की आवश्यकता होगी जिससे आप एक कॉल इनपुट करने के लिए एक सेट इंटरवल ईवेंट सेट कर सकते हैं जो आपके कॉलबैक में बदलेगा। अधिक जानकारी यहां पाया जा सकता है:

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

+0

हाय jmort, शीघ्र उत्तर के लिए धन्यवाद - हास्यास्पद अनुभवहीन अनुभव करने के जोखिम पर मुझे कहना है कि जेएसओएन और इस तरह का मेरा संपर्क बेहद सीमित है। क्या आपको बुरा लगेगा अगर मैंने कुछ कोड मांगे क्योंकि मैंने कभी XMLHttpRequests के साथ काम नहीं किया है? सही दिशा में मुझे इंगित करने के लिए सिर्फ एक लिंक या दो बिल्ली भी भयानक होगा :) - एक sidenote पर, हमारे प्रश्न का दायरा करने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद, यह निश्चित रूप से सराहना की है ... –

+0

दरअसल, आप बहुत दूर नहीं आपको इस लाइन और कॉलबैक =? 'के बाद अज्ञात फ़ंक्शन में सभी कोड लेना चाहिए, और इसे "yourCallbackToRunIfSccessful" नामक फ़ंक्शन में डालना चाहिए। फिर अपनी मूल कॉलबैक को मेरे साथ बदलें, जो कि xhr.status को जांचता है कि प्रतिक्रिया कोड क्या है। मैं एक और स्पष्टीकरण संपादन कर दूंगा। – jmort253

+0

कृपया हमें बताएं कि यह आपके लिए काम करता है या नहीं। – jmort253