我目前正在使用应用在多个地方调用gapi.signIn
方法。
因此,在每个实例中调用gapi.signIn()
,并使用不同的回调参数。
由于在没有重新加载页面的情况下执行了所有操作,这是一个单页面应用程序,后来对上述任何一种方法的调用都会导致触发每个回调。
实施例。 如果用户登录,则注销并尝试创建新的,他们被告知他们的谷歌帐户已经绑定到帐户(这是预期的行为)。但是,如果他们再次尝试登录,则在尝试创建用户时调用的上一个回调会再次被触发,并且会再次发送到该页面,说明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',
});
}
如果单击按钮1,触发第一个处理程序,signIn方法将被调用一次,如果我再单击第二个按钮,将调用两个回调方法。
输出:
// click button 1
> callback 1
// click button 2
> callback 1
> callback 2
我该怎样防止这种情况?我一直无法找到重置方法。使用相同的回调方法名称,没有帮助。覆盖窗口。[method_name]也不起作用。
答案 0 :(得分:0)
这就是我所做的 - 添加了一个var counter = 0
,它在回调函数的末尾递增。如果counter > 0
回调为空。这样它只会添加一次回调函数(这无论如何都是预期的行为,而且首先需要这个hack是令人讨厌的,感谢谷歌这样一个错误的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;
}
});