2009-01-14 25 views
9

Tôi đã một đoạn mã jQuery mà gọi vài getJSON() cuộc gọi liên tiếp nhanh chóng:jQuery phạm vi hoặc chủng tộc điều kiện trong AJAX/getJSON

var table = $("table#output"); 
for (var i in items) { 
    var thisItem = items[i]; 
    $.getJSON("myService", { "itemID": thisItem }, function(json) { 
     var str = "<tr>"; 
     str += "<td>" + thisItem + "</td>"; 
     str += "<td>" + json.someMember + "</td>"; 
     str += "</tr>"; 
     table.append(str); 
    }); 
} 

Khi tôi chạy này chống lại một máy chủ lag, bảng được dân cư với giá trị json.someMember được mong đợi (chúng không đúng thứ tự), nhưng cột thisItem được điền bằng hỗn hợp giá trị không thể đoán trước từ các lần lặp khác nhau.

Tôi giả định đây là điều cần làm với phạm vi và thời gian - chức năng gọi lại đang đọc thisItem từ phạm vi rộng hơn? Tôi có đúng không? Làm thế nào để ngăn chặn điều này?

Giải pháp thay thế hiện tại của tôi là dành cho dịch vụ JSON trả lại bản sao các dữ liệu đầu vào - điều không hài lòng khi nói ít nhất.

+0

Cảm ơn bạn đã đặt câu hỏi này. Tôi cũng đã có một số vấn đề (tôi đã nhận thức được trả về hàm không đồng bộ nhưng không chắc chắn làm thế nào để báo hiệu getJSON gọi lại vị trí nào để đặt một giá trị trả về). –

Trả lời

12

Có vẻ như vấn đề phạm vi do vòng lặp. Hãy thử điều này:

var table = $("table#output"); 
for (var i in items) { 
    var thisItem = items[i]; 
    $.getJSON("myService", { "itemID": thisItem }, (function(thisItem) { 
     return function(json) { 
      var str = "<tr>"; 
      str += "<td>" + thisItem + "</td>"; 
      str += "<td>" + json.someMember + "</td>"; 
      str += "</tr>"; 
      table.append(str); 
     } 
    })(thisItem)); 
} 

Sửa: tất cả tôi đã làm là phạm vi thisItem đến $.getJSON gọi lại.

+0

Tôi không nghĩ rằng điều này sẽ làm việc với jQuery. Không phải json sẽ kết thúc vào việc đóng cửa thay vì biến thisItem và gây ra lỗi không? – jacobangel

+1

No. $ .getJSON được truyền chức năng bên trong; một trong đó có được tham số "json". –

+0

Dường như đã làm việc một điều trị (sau khi tôi nhận được tất cả các niềng răng được sắp xếp!). Cảm ơn! – slim

3

Javascript không sử dụng khối cho phạm vi. Phạm vi chỉ dựa trên chức năng.

Nếu bạn muốn có một phạm vi mới, bạn phải khai báo một hàm bên trong mới và chạy nó ngay lập tức, đây là cách duy nhất để tạo một phạm vi mới trong Javascript.

var table = $("table#output"); 
for(var i in items) 
{ 
    (function(){ 
     var thisItem = items[i]; 
     $.getJSON("myService", { "itemID": thisItem }, function(json) 
     { 
      var str = "<tr>"; 
      str += "<td>" + thisItem + "</td>"; 
      str += "<td>" + json.someMember + "</td>"; 
      str += "</tr>"; 
      table.append(str); 
     }); 
    })(); 
} 
+0

Tôi thích giải pháp này vì nó cho phép tôi có nhiều biến cục bộ hơn như thisItem, không có chữ ký hàm chi tiết. – slim

+0

thực tế thú vị: đây là cách phạm vi thường được thực hiện trong Đề án – Javier

+0

Tôi quên một cách khác, bạn có thể sử dụng vòng lặp for từ thư viện, những thực tế này có chức năng như khối để thực thi tại mỗi lần lặp. Trong jQuery: $ .each (các mục, hàm (i, mục) {...}); –

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