繁体   English   中英

JavaScript回调函数执行了2次

[英]Javascript callback function executed 2 times

用户可以使用google登录到我的系统,因此在使用google登录按钮时,将在mysql数据库中创建他的帐户。我的问题是,当用户尝试通过google登录(即创建功能)时,每个用户帐户都创建了两次每个用户执行两次的帐户,这是我的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数据库,但是每个用户两次调用此函数。

不知道为什么函数要运行两次,但是,确保函数仅运行一次的一种方法是设置一些这样的全局标志

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM