Wednesday, June 5, 2024
 Popular · Latest · Hot · Upcoming
98
rated 0 times [  101] [ 3]  / answers: 1 / hits: 34867  / 11 Years ago, thu, october 31, 2013, 12:00:00

Is there a way to make sure a for loop has finished before running the next function?



I have a scenario where the user is presented with a list of users, they can select an X number of these users and once they press 'Done' for each user that has been selected I call a REST API service to get some more information on the selected user to add to the 'users' array.



But what's happening is whatever I place after the for loop seems to run before it has finished and therefore there are users missing from it



Sample code below:



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

}

More From » javascript

 Answers
5

api.UserSearch is an async function. You should keep track of the responses and when they have all come in, then handle the data returned.



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
}


This will increment a counter requests and when they have all come in, it should call the function done()


[#74577] Thursday, October 31, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
dantel

Total Points: 7
Total Questions: 102
Total Answers: 97

Location: Saint Lucia
Member since Sat, Jun 6, 2020
4 Years ago
dantel questions
;