等待循环完成

时间:2013-10-31 19:39:47

标签: javascript

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

}

2 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分: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..
            }
        });
    } 
}