在运行下一个函数之前,有没有办法确保for循环已经完成?
我有一个场景,用户会看到一个用户列表,他们可以选择这些用户的X个号码,一旦他们按下“完成”给每个被选中的用户,我就会调用REST API服务来获取一些用户有关要添加到“用户”数组的所选用户的更多信息。
但是发生的事情就是在for循环看起来在它完成之前运行之后放置的东西,因此有用户缺失
以下示例代码:
function doCreateStory() {
var users = [];
// Add logged in user as creator
users.push({
"id" : user_id,
"creator" : true
});
// Add all checked users
for (var i = 0, len = items.length; i < len; i++) {
if (items[i].properties.accessoryType == Ti.UI.LIST_ACCESSORY_TYPE_CHECKMARK) {
api.UserSearch({
"method" : "facebook",
"id" : items[i].properties.id
}, function(success, res, code) {
if (success == 1) {
users.push({
"id" : res.message._id,
"creator" : false
});
} else {
// Its broke..
}
});
}
}
// WANT TO DO SOMETHING HERE with 'users' array once loop has finished
}
答案 0 :(得分:15)
api.UserSearch是一个异步函数。您应该跟踪响应以及它们何时进入,然后处理返回的数据。
var requests = 0;
for (var i = 0, len = items.length; i < len; i++) {
if (items[i].properties.accessoryType == Ti.UI.LIST_ACCESSORY_TYPE_CHECKMARK) {
requests++;
api.UserSearch({
"method" : "facebook",
"id" : items[i].properties.id
}, function(success, res, code) {
requests--;
if (success == 1) {
users.push({
"id" : res.message._id,
"creator" : false
});
} else {
// Its broke..
}
if (requests == 0) done();
});
}
}
function done() {
// WANT TO DO SOMETHING HERE with 'users' array once loop has finished
}
这将增加一个计数器requests
,当它们全部进入时,它应该调用函数done()
答案 1 :(得分:3)
问题在于异步AJAX请求需要时间才能完成。处理此问题的一种方法是使用条件是您的成功处理程序:
var completedRequests = 0;
// Add all checked users
for (var i = 0, len = items.length; i < len; i++) {
if (items[i].properties.accessoryType == Ti.UI.LIST_ACCESSORY_TYPE_CHECKMARK) {
api.UserSearch({
"method" : "facebook",
"id" : items[i].properties.id
}, function(success, res, code) {
if (success == 1) {
completedRequests++;
users.push({
"id" : res.message._id,
"creator" : false
});
if (completedRequests === len){
//all ajax requests are finished
}
} else {
// Its broke..
}
});
}
}