2011-01-07 50 views
5

Tôi hiện đang phát triển một chủ đề tumblr và đã xây dựng một jQuery JSON thingamabob sử dụng API Tumblr để làm như sau:Làm thế nào để hiển thị thông báo lỗi JSON?

Người dùng sẽ nhấp vào liên kết "loại bài đăng" (ví dụ: Bài đăng video), tại đó giai đoạn jQuery sẽ sử dụng JSON để lấy tất cả các bài đăng có liên quan đến loại đó và sau đó tự động hiển thị chúng trong một khu vực được chỉ định.

Bây giờ mọi thứ hoạt động hoàn toàn với đào, ngoại trừ việc Tumblr là Tumblr và các máy chủ của họ đang sử dụng tiếng gõ mỗi lúc và sau đó, điều Tumblr API thingy đôi khi ngoại tuyến. Bây giờ tôi không thể thấy trước khi chức năng này sẽ được xuống, đó là lý do tại sao tôi muốn hiển thị một số thông báo lỗi chung chung nếu JSON (vì lý do gì) không thể tải bài đăng.

Bạn sẽ thấy tôi đã viết một số mã để hiển thị thông báo lỗi khi jQuery không thể tìm thấy bất kỳ bài đăng nào liên quan đến loại bài đăng đó NHƯNG nó không bao gồm bất kỳ lỗi máy chủ nào. Lưu ý: đôi khi tôi nhận được lỗi này:

Không thể tải tài nguyên: máy chủ đáp lại bằng một tình trạng của 503 (Dịch vụ Tạm thời không)

Đó là thông điệp này 503 Lỗi mà tôi cần phải viết một số mã , nhưng tôi hơi tránh khỏi thất bại :)

Dưới đây là đoạn code 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] = '<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 
    } 
}); 

Nếu bạn muốn xem demo trong hành động, hãy kiểm tra Elegantem nhưng làm lưu ý rằng bao giờ hết ything có thể làm việc hoàn toàn tốt cho bạn (hoặc không), tùy thuộc vào tính khí của Tumblr.


Cập nhật Được rồi, vì vậy sau khi jmorts sau trả lời bên dưới càng gần với bức thư như 2:00 cho phép, tôi đã khuấy ra đoạn mã sau không thành công - không có cảnh báo xuất hiện. Myabe tôi là một Muppet, có lẽ tôi chỉ scheleeeepy nhưng nếu bạn folks Jedi có thể mất một cái nhìn Tôi thực sự đánh giá cao nó :)

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

Lưu ý rằng JSON là ký pháp của đối tượng JavaScript, không phải là cách yêu cầu dữ liệu. Bạn có thể thay đổi câu hỏi của mình để nói về AJAX thay vì JSON vì JSON không quan trọng trong câu hỏi này. –

+0

Tôi nghĩ bạn đã hiểu nhầm JSON là gì. JSON là một định dạng biểu diễn dữ liệu; có thể bạn đang đề cập đến XmlHttpRequest (thường được gọi là "AJAX" vì một số lý do). –

+0

@Thời gian máy - Điểm tốt. JSON chỉ là một phương tiện truyền dữ liệu, như XML. Trong khi AJAX là một kỹ thuật lấy dữ liệu từ máy chủ mà không cần tải lại trang và có thể trả về dữ liệu trong XML, JSON, HTML, văn bản thuần túy và các định dạng khác, mặc dù thực tế là 'X' trong AJAX là viết tắt của 'XML' . – jmort253

Trả lời

6

callback của bạn thực sự mất 2 thông số khác bạn không hiển thị:

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

Bạn có thể sử dụng đối tượng xhr để kiểm tra trạng thái của đối tượng XMLHttpRequest thô. Nếu bạn nhận được 404, 503, 500, v.v thì bạn có thể hiển thị thông báo lỗi hoặc chạy chức năng thay thế của mình.

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

Ngoài ra, nếu bạn chưa có Firebug cho Firefox, tôi muốn khuyên bạn nên nó để gỡ lỗi JavaScript: http://getfirebug.com/

UPDATE:

Các getJSON JQuery AJAX wrapper không có trình xử lý gọi lại lỗi. Thay vào đó, bạn sẽ cần phải sử dụng trình xử lý JQuery AJAX thông thường để thực hiện yêu cầu JSON của bạn:

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

Điều quan trọng cần lưu ý là đây không phải là JSONP. Điều này có nghĩa là bạn không thể thực hiện các yêu cầu tên miền chéo bằng cách sử dụng chức năng này.

Nếu bạn đang dựa vào JSONP sử dụng câu trả lời gốc, thì bạn cần triển khai giải pháp theo đó bạn đặt một sự kiện setInterval để thăm dò giá trị sẽ được thay đổi trong hàm gọi lại của bạn. Bạn có thể tìm thêm chi tiết tại đây:

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

+0

Hi jmort, cảm ơn vì trả lời nhanh chóng - với rủi ro nghe có vẻ thiếu kinh nghiệm một cách lố bịch, tôi phải nói rằng việc tôi tiếp xúc với JSON và những điều tương tự là rất hạn chế. Bạn có phiền nếu tôi yêu cầu một số mã như tôi chưa bao giờ làm việc với XMLHttpRequests trước đây? Heck thậm chí một liên kết hoặc hai chỉ để chỉ cho tôi đúng hướng sẽ là tuyệt vời :) - Trên một sidenote, cảm ơn rất nhiều vì đã dành thời gian để phạm vi câu hỏi của chúng tôi, nó chắc chắn đánh giá cao ... –

+0

Thực ra, bạn không còn xa nữa. Bạn nên lấy tất cả mã trong hàm ẩn danh sau dòng này & callback =? ', Và đặt nó vào một hàm có tên là "yourCallbackToRunIfSuccessful". Sau đó, thay thế gọi lại ban đầu của bạn với tôi, một trong đó kiểm tra xhr.status để xem mã phản hồi là gì. Tôi sẽ thực hiện một chỉnh sửa rõ ràng khác. – jmort253

+0

Vui lòng cho chúng tôi biết nếu điều này phù hợp với bạn. – jmort253

Các vấn đề liên quan