循环问题中的jQuery ajax

ste*_*boy 19 ajax jquery loops

这个js循环脚本总是在jquery ajax函数中获取ui_item的最后一个值.如何捕获每次迭代的正确值?

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

}
Run Code Online (Sandbox Code Playgroud)

谢谢!

SLa*_*aks 47

问题是匿名回调方法ui_item通过引用捕获变量.由于只有一个变量,它总是得到最后分配给变量的任何变量.

您需要将for循环的内容包装在一个i作为参数的函数中,然后在循环中调用该函数.每次调用包装函数都会创建一个单独的变量来解决问题.

例如:

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);
Run Code Online (Sandbox Code Playgroud)

  • @awgy:对不起 我不是故意冒犯.然而,看到两个相同错误的答案(以及一个来自> 100K用户的答案),我想要坚定地避免误解.(而且,我很累) (4认同)
  • 谢谢你的纠正,但我觉得不得不加一个小笔记.有时音调在互联网上传播得不好,并且以"*WRONG*"开头的简短评论似乎很苛刻.但是,我很高兴看到你的回答并赞赏修正.来自我的+1. (3认同)