2010-12-25 6 views
0

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

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 (в зависимости от perm)

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

С уважением Nikhil Gupta.

ответ

4

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

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

Идеально. Спасибо @Felix :) – Stoic

+0

, поэтому давайте скажем, что эта функция «loop_perms» также вызывается из какой-либо другой функции, и эта функция имеет дело с результатом «loop_perms», мне также нужно вставить обратный вызов в функцию «loop_perms»? и так далее? если да, есть ли способ отключить асинхронные вызовы FB.api, а не FB.init() в целом (я не уверен здесь) – Stoic

+0

Вам нужно сделать полный перерыв в потоке кода, вырезать 'loop_perms' в две половины, один перед вызовом 'check_perm' и один за ним, который должен использоваться как функция возврата, заданная' FB.api'. – aaaaaaaaaaaa

0

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

0

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

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

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

+0

Проблема 1. Это просто неправильно, учитывая, что в области JavaScript имеется только одна переменная 'result', находящаяся в области' check_perm', и как читаемая, так и записываемая внутренней функцией. Если бы только внутренняя функция была вызвана до возвращения внешней функции, это было бы совершенно законно. – aaaaaaaaaaaa

Смежные вопросы