Javascript回调函数执行了2次

时间:2018-03-28 13:02:28

标签: javascript jquery

用户可以使用google登录登录我的系统所以当使用按google登录按钮时,他的帐户将在mysql数据库中创建 我的问题是当用户尝试通过谷歌登录时,每次创建两个用户帐户 换句话说,创建帐户的功能为每个用户执行两次 这是我的HTML代码

<a id="gp_login" href="javascript:void(0)" onclick="javascript:googleAuth()">Login using Google</a>

这是javascript代码

function gPOnLoad(){
     // G+ api loaded
     document.getElementById('gp_login').style.display = 'block';
}
function googleAuth() {
    gapi.auth.signIn({
        callback: 'gPSignInCallback',
        clientid: '636950137786-j3siaftgshtf9iamovisf603pplv7jf1.apps.googleusercontent.com',
        cookiepolicy: "single_host_origin",
        requestvisibleactions: "http://schema.org/AddAction",
        scope: "https://www.googleapis.com/auth/plus.login email https://www.googleapis.com/auth/user.phonenumbers.read https://www.googleapis.com/auth/user.birthday.read"
    })
}

function gPSignInCallback(e) {
    if (e["status"]["signed_in"]) {
        gapi.client.load("plus", "v1", function() {
            if (e["access_token"]) {
                getProfile()
            } else if (e["error"]) {alert(e['error'])
                console.log("There was an error: " + e["error"])
            }
        })
    } else {alert(e["error"]);
        console.log("Sign-in state: " + e["error"])
    }
}

function getProfile() {
    //var e = googleData.getBasicProfile();

   var e = gapi.client.plus.people.get({
       userId: "me"
    });
    e.execute(function(e) {
        if (e.error) {alert(e.message)
            console.log(e.message);
            return
        } else if (e.id) {var msgs=JSON.stringify(e);
           alert(e.displayName);
   update_user_data(e);



           // save profile data
        }
    })
}(function() {
    var e = document.createElement("script");
    e.type = "text/javascript";
    e.async = true;
    e.src = "https://apis.google.com/js/client:platform.js?onload=gPOnLoad";
    var t = document.getElementsByTagName("script")[0];
    t.parentNode.insertBefore(e, t)
})()

function update_user_data(response) 
{
    // var dataString = JSON.stringify(response);
var email=response.emails[0]['value'];
var  displayName=response.displayName;

//ar 

      $.ajax({
            type: "POST",

            data: {email:email,displayName:displayName},
            url: 'Save.php?id=check_user',
            success: function(msg) {


        var array = msg.split(',');
            var email =array[0];alert(email);
    var password = array[1];alert(password);
    $('#username').val(email);$('#password').val(password);
document.getElementById("modal4c").click();
            },
               error: function(XMLHttpRequest,textStatus,errorThrown) {//alert(JSON.stringify(msg));

            }
      });
}

update_user_data()函数是将帐户插入mysql数据库,但每个用户调用此函数两次。

1 个答案:

答案 0 :(得分:0)

不确定为什么你的功能运行两次但是, 确保函数只运行一次的一种方法是制作一些像这样的全局标志

runOnce = false;

function gPSignInCallback(e) {
  if(runOnce) return;
  runOnce = true;
  // ... rest of the function
}

如果你想避免全局变量,你可以像这样返回一个闭包

 function update_user_data(e){
   var runOnce = false
   return function(){
     if(runOnce) return;
     runOnce = true;
     // ... rest of the function
   }
 }

并将其称为update_user_data()(e)