总是获取数组中的最后一项,我需要 JavaScript 闭包吗?

Always get last item in Array, do I need a JavaScript closure?

本文关键字:一项 JavaScript 闭包 数组 获取 最后      更新时间:2023-09-26

我有一个函数,它循环遍历一个多维数组,该数组由我网页上一个区域的 id 和一个我必须传递给 Web 服务的参数组成。$.ajax()调用的返回将是我希望在数组的第一部分中填充(重绘)的 HTML:

function getViews(){
    // loop through, need view/jsp name and where we want to put the HTML... need a multidimarray...
    var viewArr = [["infoCol","info"], 
                   ["noteCol", "notes"],
                   ["buttonsDiv", "buttons"],
                   ["historyPanel","history"], 
                   ["servicesPanel","services"],
                   ["noFOUC","dialogs"]
                  ];
    // do the loop
    for(var i = 0;i<viewArr.length;i++){
        var thisArea = viewArr[i][0];
        $.ajax({
            url:"getView",
            type:"POST",
            data:{view:viewArr[i][1]},
            dataType:"html",
            success:function(data){
              console.log(thisArea); // this is always noFOUC
              // console.log(viewArr[i][0]); // this gives an undefined error...
                $("#" + thisArea).html(data);
            },
            error:function(xhr, ajaxOptions, thrownError){
                console.log(xhr.status);
                console.log(xhr.statusText);
                console.log(thrownError);
            }
        }); 
    }
}

现在一切都很好,但是尝试在成功viewArr[i][0]中引用循环的第一部分:回调不起作用!如果我把它放在成功中:它是不确定的。如果我像上面的例子一样在$.ajax()之外给它一个 var,它总是数组的最后一项!我确定我需要在这里添加一个闭包,但我不确定在哪里或为什么,有人可以解释一下吗?

如果我没有很好地措辞或解释这一点,请告诉我,我会更好地解释。

d我想我有这个...我在循环中放置了一个自执行函数...忘记了异步!循环继续...咚!

function getViews(){
    // loop through, need view/jsp name and where we want to put the HTML... need a multidimarray...
    var viewArr = [["infoCol","info"], 
                   ["noteCol", "notes"],
                   ["buttonsDiv", "buttons"],
                   ["historyPanel","history"], 
                   ["servicesPanel","services"],
                   ["noFOUC","dialogs"]
                  ];
    // do the loop
    for(var i = 0;i<viewArr.length;i++){
        (function(){
        var thisArea = viewArr[i][0];
        $.ajax({
            url:"getView",
            type:"POST",
            data:{view:viewArr[i][1]},
            dataType:"html",
            success:function(data){
                $("#" + thisArea).html(data);
            },
            error:function(xhr, ajaxOptions, thrownError){
                console.log(xhr.status);
                console.log(xhr.statusText);
                console.log(thrownError);
            }
        }); 
        })(viewArr[i][0]);
    }
}