[英]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.