回调一个.each()循环内的变量

时间:2010-12-25 23:28:03

标签: javascript jquery asynchronous callback

我有这个函数,它正在对FB.api方法进行异步调用。 现在,我正在循环一些数据并成功捕获上述方法调用的结果 但是,我使用.each循环,我真的无法弄清楚如何在我的方法中放置我的回调,所以外部方法只执行一次。

以下是我正在使用的功能:

ask_for_perms($(this).val(),function(result) {
  $('#some-div').html('<a onclick = "get_perms(result);" >get perms</a>');
});
function ask_for_perms(perms_requested,cb) {
    var request = [];
    $.each(perms_requested,function(i,permission) {
        FB.api({
            method: 'users.hasAppPermission',
            ext_perm: permission
            }, function(response) {
            if (response == 0) request.push(permission);
            request.join(',');
            cb(request); // cb is called many times here.
        });
    });
}

我正在尝试从request函数返回ask_for_perms字符串。 任何人都可以建议我在哪里放置适当的回调ask_for_perms。但是现在,它适用于我,但回调被多次调用,因为它在for循环中。

参考:returning a variable from the callback of a function

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为FB调用是异步的,并且在它们能够执行回调之前调用cb(request)。尝试检查上次请求的响应,然后调用cb函数:

function ask_for_perms(perms_req,cb) {
    var request = [];
    $.each(perms_req,function(i,req) {
        FB.api({
            method: 'users.hasAppPermission',
            ext_perm: req
            }, function(response) {
            console.log(req + ' | ' + response);
            if (response == 0) {
                request.push(req);
                if(i == perms_req.length-1) //true if last item in array
                    cb(request.join(','));
            }
        });
    });
}