Как получить (facebook) переменную изнутри функции - PullRequest
1 голос
/ 08 октября 2011

Я хочу, чтобы response.id находился вне функции в другой переменной.Это все, но я не могу заставить его работать.Я попробовал по крайней мере 12 других способов сделать это.Это всегда "неопределено".

Однако, когда я раскомментирую предупреждение внутри функции, я получаю видеть response.id во всплывающем предупреждении.

var a;  

function GetMyId() {  
    FB.api("/me",  
        function (response) {  
            a = response.id;  
            //return alert(response.id);  
            return;  
    });  
}  

a = GetMyId();  
alert(a);

1 Ответ

1 голос
/ 08 октября 2011

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

Самым важным замечанием по поводу этого обратного вызова является то, что вам, к сожалению, приходится переписывать свой код в стиле продолжения передачи. Это означает, что ваши (асинхронные) функции (например, FB) никогда не возвращают значение, а вместо этого получают обратный вызов для вызова, когда у них есть значение "return"

function getMyId(callback){
    //instead of returning an id, pass it to a
    //continuation function when we finally get it

    PB.api("/me", function(response){
        callback(response.id);
    });
}

function main(){
    getMyId(function(id){
        console.log("I can get my id", id)
    });
}

Это в основном эквивалентно следующему коду не-cps, к которому вы, возможно, более привыкли (но не можете использовать в этом случае)

function main(){
    var id = getMyId();
    console.log("i can get my id", id);
}

Теоретическое любопытство: аргументы функций также являются переменными. На самом деле вы никогда не можете использовать оператор var, злоупотребляя аргументами функции intead:)

var a = 17;
console.log('a is', a);

становится

 (function(a){
    console.log('a is', a);
 }(17));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...