Javascript 访问FB.login函数内部的变量
请查看此功能:Javascript 访问FB.login函数内部的变量,javascript,ajax,facebook,facebook-graph-api,facebook-javascript-sdk,Javascript,Ajax,Facebook,Facebook Graph Api,Facebook Javascript Sdk,请查看此功能: loginButton.on('click', function(e) { e.preventDefault(); FB.login(function(response) { var gender; var events = []; if (response.status === 'connected') { userID = response.authResponse.userID;
loginButton.on('click', function(e) {
e.preventDefault();
FB.login(function(response) {
var gender;
var events = [];
if (response.status === 'connected') {
userID = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
FB.api('/me/groups', {access_token : accessToken} ,function(res) {
for(var i = 0 ; i < res.data.length ; i++){
events.push(res.data[i].name);
$('#facebookGroups').append('<input type="radio" id="' + res.data[i].name + '"/>' + '<label for="' + res.data[i].name + '">' + res.data[i].name + '</label>').trigger('create');
}
});
FB.api('/me', {access_token : accessToken} ,function(respuesta) {
gender = respuesta.gender;
});
console.log(events);
console.log(gender);
$.ajax({
type: 'GET',
url:"http://127.0.0.1:3000/inituser",
data: {
userGender : gender,
_id : userID,
userEvents : events,
latitude : userLatitude,
longitude : userLongitude,
},
dataType: 'jsonp',
contentType: 'application/json',
crossDomain: true,
success: function(data){
console.log('data successfully sent');
},
error: function(){
console.log('there was an error');
}
});
$.mobile.pageContainer.pagecontainer('change' , '#homepage');
console.log(response);
} else {
$.mobile.pageContainer.pagecontainer('change' , '#login');
}
},{ scope: "email , user_groups , user_events" });
});
我不知道如何访问性别和事件变量。我需要在ajax调用中将它们发送到远程服务器,但在FB.api调用之外无法访问它们。我尝试在全局范围内声明它们,就在loginButton函数之后,正如您在FB.login函数中看到的那样,但是没有任何效果
这显然是一个范围问题。有没有人知道是否有解决方案?首先,您可以使用单个API-/me?fields=gender,groups,而不是两个调用-/me/groups和/mefor gender FB.api调用是异步的。因此,您必须在收到成功回调后继续。要做到这一点,您可以遵循以下结构-
loginButton.on('click', function(e) {
e.preventDefault();
FB.login(function(response) {
var gender;
var events = [];
if (response.status === 'connected') {
userID = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
GetUserDetails(); //
} else {
$.mobile.pageContainer.pagecontainer('change' , '#login');
}
},{ scope: "email , user_groups , user_events" });
});
function GetDetails(){
FB.api('/me?fields=gender,groups' ,function(res) {
userId = res.id;
gender = res.gender;
for(var i = 0 ; i < res.groups.data.length ; i++){
events.push(res.groups.data[i].name);
$('#facebookGroups').append('<input type="radio" id="' + res.groups.data[i].name + '"/>' + '<label for="' + res.groups.data[i].name + '">' + res.data[i].name + '</label>').trigger('create');
}
console.log(events);
console.log(gender);
SendToAjax(userID, gender, events);
});
}
function SendToAjax(userID, gender, events){
....
// your ajax call here
....
}
谢谢,这是非常干净的代码。我实现了它,但它仍然不起作用。我无法在GetDetails函数中记录事件或性别。我意识到这是for循环中append方法的问题。我认为在jquerymobile中,DOM还没有加载,因此append方法无法执行,因此它停止了其余代码的运行。一旦我把它拿出来,它就起作用了。但再次感谢,这是非常干净的代码。我知道这是一个初学者的问题,但是我们怎么能在函数被声明之前调用它呢?在函数被声明之前调用它js就是这样工作的——这可以帮助您理解这一点