使用 gapi.auth.authorize 函数,用户可以在不单击任何选项(没有接受或拒绝按钮)的情况下关闭弹出窗口。当这种情况发生时,我的回调函数不会触发,所以我无法处理这种情况。解决这种情况的方法是什么?
谢谢。
使用 gapi.auth.authorize 函数,用户可以在不单击任何选项(没有接受或拒绝按钮)的情况下关闭弹出窗口。当这种情况发生时,我的回调函数不会触发,所以我无法处理这种情况。解决这种情况的方法是什么?
谢谢。
这个问题已经存在了一段时间,但是当我调查这个问题时(我想在 google 身份验证窗口打开时显示一个微调器,如果用户决定不进行身份验证则隐藏它),并发现 gapi 正在抛出一个错误popup_closed_by_user
。在抛出之前有两秒的延迟(有点长,Facebook 是即时的),但它确实有效。万岁,谷歌!
一些示例代码(角度 1.x)prompting
是显示微调器的属性:
_google_obj.prompting = true;
gapi.auth2.getAuthInstance().signIn().then(function(googleResponse){
var token = googleResponse.getAuthResponse().id_token;
SVC_exec_.post('/q/goog', 1000, { token: token }, 'signing you in through Google', function (response) {
if (response.code === 'ok') {
// update the UI
}
_google_obj.prompting = false;
});
},
function(error){
$timeout(function () {
console.log('user probably closed the google popup window: '+error);
_google_obj.prompting = false;
});
});
他们似乎没有在任何文档中提及它,但gapi.auth.authorize()
返回了 popup Window
。所以你可以保存返回Window
并设置一个间隔或超时来检查Window.closed
。
所以你来自谷歌的 auth 函数返回promise,而不是一个窗口。但是您可以将原始窗口包装到函数中,该函数将设置间隔,以检查打开的窗口是否已经关闭。
// variable to store our deferred object
var authDefer = null;
function auth() {
// right before the auth call, wrap window.open
wrap();
// Call auth
authDefer = window.gapi.auth.authorize({
client_id: ...,
scope: ...,
immediate: ...
}).then(
// onSuccess,
// onReject,
// onNotify
);
}
function wrap() {
(function(wrapped) {
window.open = function() {
// re-assign the original window.open after one usage
window.open = wrapped;
var win = wrapped.apply(this, arguments);
var i = setInterval(function() {
if (win.closed) {
clearInterval(i);
if (authDefer) {
authDefer.cancel();
}
}
}, 100);
return win;
};
})(window.open);
}
取自谷歌论坛上的一个主题。真的有效。