Javascript无法设置变量值
我试图让这个函数设置sortedScores为一个值...每当我做console.log它似乎存储值的权利,但它实际上不能设置sortedScores正确...Javascript无法设置变量值
function facebook(sortedfriends) {
var myID;
var access_token;
FB.init({
appId : something,
status : true,
cookie : true,
xfbml : true,
});
FB.getLoginStatus(function(response, sortedfriends) {
if(!response.session) {
FB.login(function(response) {
myId = response.session.uid;
access_token = response.session.access_token;
//does stuff
if (!response.session) {
console.log('User cancelled login or did not fully authorize.');
}
});
}
else if(response.session) {
myId = response.session.uid;
access_token = response.session.access_token;
var D = new Array();
this.access_token = access_token;
FB.api('/me/feed?access_token=' + access_token + '&limit=100', function(response, sortedfriends) {
for(i=0; i<response.data.length; i++) {
var msg = response.data[i];
D.push(msg);
}
sortedfriends = somefunction(D, myID);
//i know somefunction works because if i do console.log(sortedfriends) it shows me the right values...
});
}
});
}
当我尝试 var friends; facebook(朋友); 朋友只是未定义... halp?
目前还不清楚您尝试访问sortedfriends的位置,但我猜你的问题是Facebook登录是异步的,所以在facebook
函数完成之后的一段时间后会有响应。因此,如果您在调用facebook
函数后立即尝试使用sortedfriends数据,则数据将不会存在,因为登录调用尚未完成。
使用sortedfriends
数据的唯一方法是从成功处理程序到登录调用(您的console.log已经验证数据在那里)。如果您想在其他代码中使用它,请将成功处理程序中的其他代码调用到登录调用。调用facebook
函数后,您无法调用该代码。
因为登录调用的异步特性这个逻辑将无法正常工作(它尚未完成时facebook
调用返回并执行后,继续说:相反,你必须做这种类型的
var sortedfriends = [];
facebook(sortedfriends);
// use sortedfriends here
结构:
var sortedfriends = [];
facebook(sortedfriends);
// nothing executes here
而且,你的Facebook的电话,你有这里面,添加一个函数调用您想要使用的sortedfriends数据的任何代码:
else if(response.session) {
myId = response.session.uid;
access_token = response.session.access_token;
var D = new Array();
this.access_token = access_token;
FB.api('/me/feed?access_token=' + access_token + '&limit=100', function(response, sortedfriends) {
for(i=0; i<response.data.length; i++) {
var msg = response.data[i];
D.push(msg);
}
sortedfriends = somefunction(D, myID);
//i know somefunction works because if i do console.log(sortedfriends) it shows me the right values...
// call the rest of your code here that will use sortedfriends
doSomethingWithSortedFriends(sortedfriends);
});
非常感谢,这会奏效......但是当我与一个合作伙伴一起工作时,这意味着我们必须大大重新安排程序的其他部分......嗯。有没有其他办法?如果我确保Facebook完全执行,我可以在执行后执行代码吗? –
一些Ajax调用可以同步,但这通常是一个糟糕的设计决策,因为它在网络调用期间锁定了浏览器。此外,这是Facebook的API,所以你可能甚至没有这个选项。因此,您只需重构代码即可完成完成功能,并在启动呼叫后不执行任何操作。这只是使用JavaScript(或任何其他语言)进行异步网络调用的生活。确保facebook通话完成的方法是从成功回调 - 没有更好的方法。 – jfriend00
javascript函数不会更改传入引用。您无法通过undefined
,并希望在该函数执行后它将被定义。
相反,你应该让你的sortedFriends
一个全局变量,而不是作为函数参数传递它。请注意,sortedFriends
的值将在执行getLoginStatus
内部的ajax查询后设置,因此在执行facebook
函数后,您将无法立即使用该值。
这很奇怪...所以我需要一些逻辑,如if(!sortedfriends)sortedFriends = somefunction(D,myID)?另外,使sortedfriends成为一个全局变量,以便在函数之外初始化它 –
它只是我还是拼写错误** halp **比它应该更常见?是否有一个原因? – ChaosPandion
@ChaosPandion:http://www.google.se/search?q=halp&hl=sv&client=firefox-a&hs=MaK&rls=org.mozilla:en-GB:official&prmd=ivns&tbm=isch&tbo=u&source=univ&sa=X&ei=3yFUTo3bEYbHtAb0sOED&ved= 0CDoQsAQ&biw = 1074&bih = 897 – Guffa