2010-04-22 59 views
16

Tập lệnh vòng lặp js này luôn nhận giá trị cuối cùng của ui_item bên trong một jquery ajax funciton. Làm thế nào có thể nắm bắt được giá trị chính xác của mỗi lần lặp?jQuery ajax bên trong một vấn đề vòng lặp

for (var i = 0; i <= split_files_cb_value_holder.length - 1; i++){ 
    var split_values = split_files_cb_value_holder[i].split(':'); 

    ui_item = split_files_cb_value_holder[i]; 

    $.ajax({ 
     type: "POST", 
     url: "ds/index.php/playlist/check_folder", 
     data: "component_type="+$('#component_type').val()+"&value="+split_values[1], 
     success: function(msg) 
     { 
      console.log(ui_item); //ALWAYS GETS THE LAST VALUE 
     }, 
     error: function() 
     { 
      alert("An error occured while updating. Try again in a while"); 
     } 
    }); 

} 

Cảm ơn!

+0

Thêm 'let' trước khi ui_item sẽ giải quyết vấn đề này. – kamushin

Trả lời

42

Vấn đề là phương thức gọi lại ẩn danh sẽ ghi lại biến số ui_item bằng cách tham chiếu. Vì chỉ có một biến, nó luôn luôn nhận được bất cứ điều gì đã được gán cuối cùng cho biến.

Bạn cần bọc nội dung của vòng for trong một hàm lấy i làm tham số, sau đó gọi hàm trong vòng lặp. Mỗi cuộc gọi đến hàm wrapper sẽ tạo ra một biến riêng biệt, giải quyết vấn đề.

Ví dụ:

function doCheck(i) { 
    var split_values = split_files_cb_value_holder[i].split(':'); 

    var ui_item = split_files_cb_value_holder[i]; 

    $.ajax({ 
     type: "POST", 
     url: "ds/index.php/playlist/check_folder", 
     data: "component_type="+$('#component_type').val()+"&value="+split_values[1], 
     success: function(msg) 
     { 
      console.log(ui_item); //Don't always get the last value 
     }, 
     error: function() 
     { 
      alert("An error occured while updating. Try again in a while"); 
     } 
    }); 
} 

for (var i = 0; i < split_files_cb_value_holder.length; i++) 
    doCheck(i); 
+3

Cảm ơn bạn đã sửa, nhưng tôi cảm thấy bắt buộc phải thêm một ghi chú nhỏ. Đôi khi giai điệu không được truyền tải tốt trên internet, và để có được một bình luận ngắn gọn bắt đầu với "* WRONG *" dường như khắc nghiệt. Nhưng, tôi rất vui khi thấy câu trả lời của bạn và đánh giá cao sự điều chỉnh. +1 từ tôi. – awgy

+3

@awgy: Tôi xin lỗi; Tôi không có ý xúc phạm. Tuy nhiên, nhìn thấy hai câu trả lời sai giống hệt nhau (và một từ một người sử dụng> 100K), tôi muốn vững chắc đầu ra quan niệm sai lầm. (Và, tôi đã kiệt sức) – SLaks

+0

tuyệt vời, cảm ơn bạn rất nhiều –

-4

Bật async tắt, nó sẽ khắc phục vấn đề tôi đoán. Ý tôi là thêm: async: false

+3

Vâng đó là một 'nhanh chóng và bẩn' sửa chữa gây ra trình duyệt để tải chậm thậm chí có thể làm gián đoạn tải, hoàn toàn. – MadushM

+3

Là bản cập nhật: async false không còn được dùng như jQuery 1.8 nữa. http://api.jquery.com/jQuery.ajax/ – fldsofglry

+1

Tắt Async là một ý tưởng khủng khiếp .... – Rob

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