Javascript Ajax已完成调用如何通过副本传递变量

Javascript Ajax已完成调用如何通过副本传递变量,javascript,ajax,Javascript,Ajax,这是我的密码: for (var i = 0; i < list.length; i++) { $.when( $.ajax({url: "./dorequest.php?id=" + list[i], success: function(response){ jsonFriendlist = response; }}) ).done( function(jsonFriendlist) { var friendList

这是我的密码:

for (var i = 0; i < list.length; i++) {
    $.when(
    $.ajax({url: "./dorequest.php?id=" + list[i],
        success: function(response){ jsonFriendlist = response; }}) ).done(
        function(jsonFriendlist) {
            var friendListObject = JSON.parse(jsonFriendlist);
            if (!jQuery.isEmptyObject(friendListObject)) {
                var rawListFriend = friendListObject.friendslist.friends;
                for (var j = 0; j < rawListFriend.length; j++) {
                    console.log(i);
                    playerLinkList[i].listFriends.push(rawListFriend[j].id);
                }
            }
        }
    );
for(变量i=0;i
}

基本上,我尝试更新数组
列表
中对象的一部分,通过该数组中的项目I发送请求。但是代码失败了,因为我用i=13(即
list.lenght
)完成了对“done”函数的每次调用。 我的理解是,由于发送请求和检索结果需要时间,并且在调用done函数时是异步完成的,因此主线程已经超出了
,因此i=13

我的问题是,在发送ajax请求时,如何通过副本传递来“冻结”I


谢谢,使用闭包解决了这个问题

for (var i = 0; i < playerIds.length; i++) {
    // Pass the parameter "i" to the done functions
    (function(index) {
        var dfd = $.ajax({url: "./dorequest.php?id=" + playerIds[i] + "&requesttype=friendlist",
                success: function(response){ jsonFriendlist = response; }});

        dfd.done(
                function(jsonFriendlist) {
                    var friendListObject = JSON.parse(jsonFriendlist);
                    if (!jQuery.isEmptyObject(friendListObject)) {
                        var rawListFriend = friendListObject.friendslist.friends;
                        for (var j = 0; j < rawListFriend.length; j++) {
                            playerLinkList[index].listFriends.push(rawListFriend[j].steamid);
                        }
                    }
                }
        );
    })(i);
}
for(变量i=0;i