10

有没有办法在运行下一个函数之前确保 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 

}
4

2 回答 2

20

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

于 2013-10-31T19:45:52.193 回答
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..
            }
        });
    } 
}
于 2013-10-31T19:44:47.700 回答