Ajax完成调用如何通过复制传递变量

时间:2014-07-12 18:04:51

标签: 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 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);
                }
            }
        }
    );

}

基本上我尝试更新数组list中的一个对象的一部分,通过该数组的项i发送请求。但是代码失败了,因为每次调用&#34;完成&#34;函数i完成i = 13(即list.lenght)。 我的理解是,由于请求需要花费时间来发送检索结果,并且因为在调用完成函数时它已完成异步,所以主线程已经超出for所以i = 13. / p>

我的问题是如何设法&#34;冻结&#34;我发送ajax请求时通过副本传递它吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

使用闭包解决了这个问题。

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