[英]Wait for loop to finish
有没有办法确保在运行下一个函数之前完成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
}
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()
问题在于asyncrounus 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..
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.