2010-07-02 50 views
8

Có vẻ như các cuộc gọi lại thành công, lỗi và hoàn thành chỉ kích hoạt khi yêu cầu ajax có thể nhận được một số phản hồi từ máy chủ.Kiểm tra trạng thái yêu cầu ajax của jQuery

Vì vậy, nếu tôi tắt máy chủ, lỗi gọi lại sau sẽ không được thực hiện và yêu cầu không âm thầm.

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error"); 
    } 
}); 

Cách tốt nhất để ném lỗi khi máy chủ không thể truy cập được.

Chỉnh sửa - Từ những gì tôi đã thử và đọc nó xuất hiện rằng việc xây dựng lỗi xử lý lỗi của jQuery không hoạt động với JSONP hoặc dataType: "script". Vì vậy, tôi sẽ cố gắng đặt thời gian chờ thủ công.

Chỉnh sửa - Đã nghiên cứu thêm một chút và có vẻ như không chỉ lời gọi lỗi ajax không hoạt động, nhưng bạn không thể hủy yêu cầu ajax với tập lệnh dataType hoặc jsonp và những yêu cầu đó bỏ qua cài đặt thời gian chờ.

Có một giải pháp thay thế - plugin jquery-jsonp, nhưng nó sử dụng iframe ẩn mà tôi muốn tránh. Vì vậy, tôi đã giải quyết khi tạo thời gian chờ thủ công như được đề xuất bên dưới. Bạn không thể hủy bỏ yêu cầu nếu nó hết thời gian, có nghĩa là tập lệnh vẫn có thể tải ngay cả sau khi hết thời gian chờ, nhưng ít nhất một thứ sẽ kích hoạt nếu máy chủ không khả dụng.

+0

jQuery ajax có lỗi xử lý được xây dựng trong (xem câu trả lời của tôi dưới đây), bạn có thể sử dụng ajaxsetup để áp dụng các tùy chọn này. – Sphvn

Trả lời

7

Bạn có thể sử dụng setTimeout và xóa nó bằng clearTimeout trong trình xử lý hoàn chỉnh.

var reqTimeout = setTimeout(function() 
{ 
    alert("Request timed out."); 
}, 5000); 
var xhr = $.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error");   
    }, 
    complete: function() { 
    clearTimeout(reqTimeout); 
    } 
}); 
+0

Có vẻ như đây là giải pháp duy nhất. Làm việc tốt cho đến nay, ngoại trừ xhr.abort(). Firebug cho một lỗi rằng xhr là không xác định. –

0

Nếu tôi nhớ chính xác, jQuery sẽ ném ngoại lệ. Vì vậy, bạn sẽ có thể làm việc với một try { ... } catch() { ... } và xử lý nó ở đó.

5

jQuery.ajax đã có tùy chọn timeout và nó sẽ gọi trình xử lý lỗi của bạn nếu yêu cầu hết giờ. Kiểm tra the fantastic documentation mà nói - Tôi muốn nêu lên ở đây, tôi nhấn mạnh:

timeoutNumber

cài đặt thời hạn địa phương (trong mili giây) để yêu cầu ...

và:

error (XMLHttpRequest, textStatus, errorThrown) Function

Chức năng được gọi nếu yêu cầu không thành công. Hàm này được chuyển qua ba đối số: Đối tượng XMLHttpRequest, một chuỗi mô tả loại lỗi xảy ra và một đối tượng ngoại lệ tùy chọn, nếu một đối tượng xảy ra. Giá trị có thể cho đối số thứ hai (ngoài null) là "thời gian chờ", "lỗi", "notmodified" và "parsererror". Đây là một sự kiện Ajax.

+0

tiếc là không hết thời gian chờ cũng như lỗi làm việc cho dataType: Jsonp hoặc tập lệnh. –

+0

Tôi đang sử dụng JSONP và nó hoạt động^^ nhưng bất cứ điều gì nổi thuyền của bạn. – Sphvn

+2

Đối với JSON-P, hãy thử một dự án có tên là 'jquery-jsonp'. –

0

Bạn có thể sử dụng AjaxSetup của Jquery để xử lý việc xử lý lỗi của bạn.

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
     alert("success"); 
    }, error: function() { 
     alert("error"); 
    } 
    //AJAX SETUP "error"// 
    $.ajaxSetup({ 
     "error": function (XMLHttpRequest, textStatus, errorThrown) { 
      alert(XMLHttpRequest + ' ' + textStatus + ' ' + errorThrown); //however you want 
     } 
    }); 
0

trong IE8, có thể sử dụng:

success: function(data, textStatus, XMLHttpRequest) { 
    if("success"==textStatus&&XMLHttpRequest){ 
     alert("success"); 
    }else{ 
     alert("server down"); 
    } 
    } 

nhưng nó không thể làm việc trên chrome, firefox ... tôi đã cố gắng

1
error: function (jqXHR, textStatus, errorthrown) { 
    if (jqXHR.readyState == 0) { 
     //Network error, i.e. server stopped, timeout, connection refused, CORS, etc. 
    } 
    else if (jqXHR.readyState == 4) { 
     //HTTP error, i.e. 404 Not found, Internal Server 500, etc. 
    } 
} 

Sử dụng readyState của XMLHttpRequest để xác định tình trạng của các yêu cầu ajax. 'readyState' giữ trạng thái của XMLHttpRequest.

  • 0: Yêu cầu không được khởi tạo
  • 1: kết nối máy chủ thành lập
  • 2: yêu cầu nhận được
  • 3: thực hiện yêu cầu
  • 4: yêu cầu hoàn thành và đáp ứng sẵn sàng
Các vấn đề liên quan