Ограничение размещения продолжения внутри функции обратного вызова - это цена, которую вы должны заплатить в 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));