这是我的代码:
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请求时通过副本传递它吗?
谢谢,
答案 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);
}