Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问FB.login函数内部的变量_Javascript_Ajax_Facebook_Facebook Graph Api_Facebook Javascript Sdk - Fatal编程技术网

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就是这样工作的——这可以帮助您理解这一点