gapi.signIn 调用多个回调



我目前正在多个地方使用应用程序调用gapi.signIn方法。

  1. 当用户登录时
  2. 当用户注册时
  3. 当用户想要将其应用帐户关联到其 Google 帐户时
因此,在这些实例

中,每个实例都使用不同的回调参数调用gapi.signIn()

由于这是一个单页应用,一旦执行了所有操作而无需重新加载页面,并且稍后对上述任何方法的调用都会导致触发每个回调。

前任。如果用户登录,则注销并尝试创建一个新帐户,系统会告知他们的Google帐户已绑定到帐户(这是预期行为)。 但是,如果他们尝试再次登录,则尝试创建用户时调用的上一个回调将再次触发,并且他们将再次被发送到解释Google帐户与应用帐户绑定的页面。

用一个简单的代码示例来解释事情:

    var ENV = {...};
    function handleClickOfButton_1() {
        window.authCallback_1 = function() {
            console.log('callback 1');
        };
        // attach callback one
        gapi.auth.signIn({
        clientid:     ENV.APP.GOOGLE_AUTH.clientid,
        scope:        ENV.APP.GOOGLE_AUTH.scope,
        cookiepolicy: 'single_host_origin',
        callback:     'authCallback_1',
      });
    }
    function handleClickOfButton_2() {
        window.authCallback_2 = function() {
            console.log('callback 2');
        };
        // attach callback one
        gapi.auth.signIn({
        clientid:     ENV.APP.GOOGLE_AUTH.clientid,
        scope:        ENV.APP.GOOGLE_AUTH.scope,
        cookiepolicy: 'single_host_origin',
        callback:     'authCallback_2',
      });
    }

如果我单击第一个按钮(触发第一个处理程序),则 signIn 方法将被调用一次,如果我单击第二个按钮,则将调用两个回调方法。

输出:

// click button 1
> callback 1
// click button 2
> callback 1
> callback 2

我该如何防止这种情况?我无法找到重置方法。 使用相同的回调方法名称无济于事。 覆盖窗口。[method_name] 也不起作用。

这就是

我所做的 - 添加一个var counter = 0,在回调函数的末尾递增。如果counter > 0则回调将为空。这样它只添加一次回调函数(无论如何这是预期的行为,而且首先需要这个黑客真是令人讨厌,谢谢谷歌提供这样一个有缺陷的 API :/)。

var counter = 0;
gapi.auth.signIn({
  clientid: '1234567890',
  cookiepolicy: 'single_host_origin',
  scope: 'profile email',
  callback: counter > 0 ? null : function signInCallback(authResult) {
    if (authResult['status']['signed_in'] && authResult['status']['method'] == 'PROMPT') {
      var token = authResult.access_token;
      // Update the app to reflect a signed in user
      // Hide the sign-in button now that the user is authorized, for example:
      gapi.client.load('plus', 'v1', function() {
        gapi.client.plus.people.get({
          userId: 'me'
        }).execute(function(response) {
          console.log('Do my thing here...');
        });
      });
    } else {
      // Update the app to reflect a signed out user
      // Possible error values:
      //   "user_signed_out" - User is signed-out
      //   "access_denied" - User denied access to your app
      //   "immediate_failed" - Could not automatically log in the user
      console.log('Sign-in state: ' + authResult['error']);
    }
    counter = 1;
  }
});

最新更新