我想在另一个变量中使用函数外的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);
答案 0 :(得分:1)
仅限于将延续内置于回调函数中是您必须在Javascript中支付以便能够执行异步代码的代价。在你的例子中,你可以让原始函数继续执行其他请求,并且只要事件循环有空闲时间,FB响应后仍然可以正确调用回调。
关于这个回调内容的最重要注意事项是,遗憾的是,您必须以延续传递方式重写代码。这意味着你的(异步)函数(比如FB)永远不会返回一个值,而是在它们具有“返回”值时接收回调函数
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);
}
理论上的好奇心:函数参数也是变量。实际上,您可以通过滥用函数参数intead来使用var
语句:)
var a = 17;
console.log('a is', a);
变为
(function(a){
console.log('a is', a);
}(17));