обратный вызов для переменной, которая находится внутри цикла .each () - PullRequest
0 голосов
/ 26 декабря 2010

У меня есть эта функция, которая выполняет асинхронный вызов метода 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.

ссылка: возвращение переменной из обратного вызова функции

1 Ответ

1 голос
/ 26 декабря 2010

Это происходит потому, что ваши вызовы FB асинхронны и вы вызываете cb (запрос), прежде чем они смогут выполнить свои обратные вызовы.Попробуйте проверить последний запрошенный ответ, затем вызовите вашу функцию 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(','));
            }
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...