等待循环完成

Wait for loop to finish

本文关键字:循环 等待      更新时间:2023-09-26

有没有办法在运行下一个函数之前确保 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.用户搜索是一个异步函数。 您应该跟踪响应以及它们何时全部传入,然后处理返回的数据。

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()

问题在于异步 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..
            }
        });
    } 
}