我有这个函数,它正在对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循环中。
答案 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(','));
}
});
});
}