为什么这个回调多次被触发?

时间:2014-05-29 23:45:58

标签: javascript google-api

我正在将Google+ JS API与我的网站集成,并且遇到了一个奇怪的问题。按下我的登录按钮后,我将其调用以下功能:

function googlePlusLogin() {
    console.log("inside googlePlusLogin()");

    gapi.auth.signIn({
        'clientid' : '[id]',
        'cookiepolicy' : 'single_host_origin',
        'scope' : 'profile email',
        'callback' : function() {console.log('test');}
    });
}

第一次单击按钮时,控制台输出为:

inside googlePlusLogin()
test

正如所料。但是,每次额外的时间我点击按钮(触发上述功能)的次数test打印出增量。因此,例如,第二次单击按钮时输出为:

inside googlePlusLogin()
test
test

第三次单击按钮时,输出为:

inside googlePlusLogin()
test
test
test

等等..

导致此行为的原因是什么?

注意:我将其标记为JavaScript,因为我认为这可能是一个基本的JS概念,我不理解。

1 个答案:

答案 0 :(得分:0)

相当陈旧,但我遇到了同样的问题,所以将来参考:

似乎每次调用gapi.auth.signIn时,“回调”功能都会添加到某些回调列表中。因此,仅在您第一次调用gapi.auth.signIn 时设置回调参数,例如

function googlePlusLogin() {
  console.log("inside googlePlusLogin()");

  if(window.__callback_initialized) {
    gapi.auth.signIn({
      'clientid' : '[id]',
      'cookiepolicy' : 'single_host_origin',
      'scope' : 'profile email'
    });
  } else {
    gapi.auth.signIn({
      'clientid' : '[id]',
      'cookiepolicy' : 'single_host_origin',
      'scope' : 'profile email',
      'callback' : function() {console.log('test');}
    });
    window.__callback_initialized = true;
  }
}

模拟DRY违规行为。