簡體   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