简体   繁体   English

JavaScript回调函数执行了2次

[英]Javascript callback function executed 2 times

users can sign in to my system using google sign in so when use pressing google sign in button his account will be create in mysql database my problem is every users account created two time when user trying to sign in by google in other words function of create account executed two time for every user here is my html code 用户可以使用google登录到我的系统,因此在使用google登录按钮时,将在mysql数据库中创建他的帐户。我的问题是,当用户尝试通过google登录(即创建功能)时,每个用户帐户都创建了两次每个用户执行两次的帐户,这是我的html代码

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

this is javascript code 这是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() function is to insert account into mysql database but this function is called twice per user. update_user_data()函数用于将帐户插入mysql数据库,但是每个用户两次调用此函数。

Not sure why you function runs twice but, one way to ensure a function runs only once would be make some global flag like this 不知道为什么函数要运行两次,但是,确保函数仅运行一次的一种方法是设置一些这样的全局标志

runOnce = false;

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

If you want to avoid global vars you could return a closure like this 如果要避免全局变量,则可以返回这样的闭包

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

And call it like this update_user_data()(e) 并像这样调用它update_user_data()(e)

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

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