возвращая переменную из обратного вызова функции - PullRequest
0 голосов
/ 26 декабря 2010

Я использую следующие функции:

function loop_perms(permissions) {
.... call check_perm here....
}
function check_perm(perm) {
        var result;
        FB.api(
         {
            method: 'users.hasAppPermission',
            ext_perm: perm
         }, function(response) {
            result = response;
         });
         return result;
    }

Теперь проблема в том, что я получаю undefined из результата check_perm, тогда как в консоли Firebug я вижу, что response имеет значение 0 или 1 (в зависимости от перми)

Кто-нибудь знает, что я делаю неправильно?Я предполагаю, что это как-то связано с тем, что я пытаюсь получить значение переменной внутри обратного вызова.

С уважением, Нихил Гупта.

Ответы [ 3 ]

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

Я предполагаю, что API Facebook является асинхронным.Таким образом, во время выполнения return result обратный вызов еще не был вызван.Вы должны предоставить обратный вызов из вызывающей функции:

function check_perm(perm, callback) {
    var result;
    FB.api(
     {
        method: 'users.hasAppPermission',
        ext_perm: perm
     }, callback);
}

и

function loop_perms(permissions) {
    check_perm(whatever here, function(result) {
        // do something with result
    });
}
0 голосов
/ 26 декабря 2010

Проблема 1: результат читается обратным вызовом, но это копия, поэтому не может быть записана так, как вы думаете.(локально записываемый не глобально, эту подзадачу можно было бы «исправить», сделав ее глобальной переменной, но это все равно не заставило бы ваш код работать)

Проблема 2: FB.api, скорее всего, вызывает этот обратный вызовв будущем асинхронно, позволяя check_perm немедленно возвращаться с результатом, в каком бы состоянии оно в настоящее время не находилось (undefined)

Вам нужно поместить код, который имеет дело с фактическим ответом, в эту функцию обратного вызова, которая будет выполняться, когда ответ станет доступен,Вам даже не понадобится переменная результата в этой точке.

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

Похоже, что вы вызываете FB.api асинхронно, передавая ему анонимную функцию в качестве обратного вызова, который дает result значение. check_perm возвращает до обратного вызова, и в этот момент result все еще не определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...