2011-08-09 36 views
5

Mã của tôi là:Làm cách nào để gỡ lỗi yêu cầu jQuery Ajax?

var test = "it isn't working"; 
var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', //This is in the same site as the page calling this request, so it's not a same-domain error. 
    success: function(){ 
      test = "it's working"; 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 
alert(test); 

Tôi đã thử nghiệm mã trạng thái và nó xuất hiện để 200 và hàm lỗi không bao giờ đi tắt, nhưng cũng như thế với chức năng thành công. Như tôi đã nói trong bình luận của tôi, nó không phải là lỗi chính sách gốc. Nó chỉ nói rằng "nó không hoạt động". Những gì đang xảy ra ở đây?

Trả lời

5

Cuộc gọi ajax của bạn không đồng bộ. Nó chưa hoàn thành khi cảnh báo của bạn ở cuối chạy. Đặt một cảnh báo thực tế trong chức năng thành công và bạn sẽ thấy kết quả của bạn ở đó.

Hãy nhớ rằng thực hiện cuộc gọi ajax chỉ bắt đầu cuộc gọi ajax không đồng bộ và sau đó phần còn lại của mã của bạn tiếp tục chạy. Trong ví dụ mã bạn đã đăng, điều đó có nghĩa là cuộc gọi alert(test) của bạn chạy ngay trước khi cuộc gọi ajax hoàn tất.

Bạn CHỈ có thể kiểm tra kết quả của cuộc gọi ajax từ bên trong trình xử lý thành công.

var test = "it isn't working"; 
var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', //This is in the same site as the page calling this request, so it's not a same-domain error. 
    success: function(){ 
      alert("it's working"); // put this here and you will see it 
            // if the ajax call is successful 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 
+0

Bạn cũng có tùy chọn thêm 'async: true' để các thiết lập bạn vượt qua trong 'ajax' cuộc gọi của bạn, nhưng hãy nhớ rằng điều này sẽ ngăn chặn rằng toàn bộ sợi thực hiện trong tập lệnh của bạn cho đến khi yêu cầu đã được trả lại. – dfreeman

+0

@SchiefGelaufen - Tôi cho rằng bạn có nghĩa là 'không đồng bộ: sai'. Biến cuộc gọi ajax thành một cuộc gọi đồng bộ thực sự là một lựa chọn, nhưng vì nó khóa toàn bộ trang web trong suốt thời gian gọi ajax, nó hiếm khi là sự lựa chọn thiết kế tốt nhất. Mã phức tạp hơn với 'async: true', nhưng mang lại trải nghiệm người dùng tốt hơn. – jfriend00

+0

Rất tiếc, lỗi lầm ngớ ngẩn của tôi. Có, 'không đồng bộ: sai'. Không nhất thiết phải thực hiện yêu cầu ajax đồng bộ sẽ khóa toàn bộ trang (ít nhất, có một số trường hợp mà nó không có), nhưng chắc chắn được coi là thực hành tốt hơn để đặt bất kỳ logic nào dựa vào phản hồi trong thành công của bạn gọi lại. – dfreeman

0

Bạn có thể làm cho nó như

var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', 
    success: function(){ 
      alert("it's working"); 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 

này sẽ làm việc ....

1

Move rằng alert (thử nghiệm) từ cuối vào chức năng thành công của các cuộc gọi ajax. Nếu cảnh báo có nghĩa là mã đang hoạt động thì không. bạn chỉ có thể gỡ lỗi cuộc gọi ajax trên sự trở lại thành công của nó.

var test = "it isn't working"; 
var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', 
    success: function(){ 
      test = "it's working"; 
      alert(test); //It will alert when you ajax call returns successfully. 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 

Hy vọng điều này sẽ hữu ích.

2

Để gỡ lỗi các loại sự vật này, tôi find Firebug một công cụ không thể thiếu. Nó sẽ cho bạn thấy chính xác phản hồi từ máy chủ (lỗi 500, lỗi 553, bạn có gì). Bạn có thể đặt điểm ngắt trong mã Javascript của mình và gỡ lỗi từng bước một. Firebug hoạt động trên Firefox.

Đối với IE, bạn có thể sử dụng tính năng Công cụ dành cho nhà phát triển tương tự như Firebug, đặc biệt trên IE9 có vẻ trưởng thành hơn các phiên bản trước của Công cụ dành cho nhà phát triển cho IE7 hoặc IE8.

+0

Đối với IE, cũng có Firebug Lite - http://getfirebug.com/firebuglite –

+0

Bạn cũng có thể chỉ cần nhấn CTRL-SHIFT-J trong Chrome – pilavdzice

12

Hãy thử điều này:

error: function(jqXHR, textStatus, errorThrown) { 
     console.log(JSON.stringify(jqXHR)); 
     console.log("AJAX error: " + textStatus + ' : ' + errorThrown); 
} 
Các vấn đề liên quan