如何通过REDX传奇处理Google OAuth流程
问题描述:
我正尝试使用REDX传奇实现Google OAuth 2。如何通过REDX传奇处理Google OAuth流程
我有我的传奇观察者监听GOOGLE_AUTH
动作,然后执行googleLogin
function *watchGoogleAuth() {
yield *takeLatest(GOOGLE_AUTH, googleLogin)
}
function *googleLogin() {
const id_token = yield call(GoogleSignIn);
console.log(id_token);
const response = yield call(HttpHelper, 'google_token', 'POST', id_token, null);
console.log(response);
}
为GoogleSignIn
的实现是在apis.js
export function GoogleSignIn() {
const GoogleAuth = window.gapi.auth2.getAuthInstance();
GoogleAuth.signIn({scope: 'profile email'})
.then(
(res) => {
const GoogleUser = GoogleAuth.currentUser.get();
return {
id_token: GoogleUser.getAuthResponse().id_token
};
},
(err) => {
console.log(err)
}
)
}
但传奇似乎并没有等待GoogleSignIn
来完成。只要OAuth同意屏幕弹出,传奇继续执行console.log
而不等待谷歌登录承诺返回实际数据。
有没有更好的方法来处理这种情况?谢谢!
答
要扩展@ HenrikR的答案,生成器不会等待,除非它收到承诺。
export const GoogleSignIn =() => {
const GoogleAuth = window.gapi.auth2.getAuthInstance();
return new Promise((resolve, reject) => {
GoogleAuth.signIn({scope: 'profile email'})
.then(
(res) => {
const GoogleUser = GoogleAuth.currentUser.get();
resolve(GoogleUser.getAuthResponse().id_token);
},
(err) => {
reject(err)
}
);
});
}
因此,您应该将yield语句包装在try/catch中。简化且有些懒惰:
function *googleLogin() {
try {
const id_token = yield call(GoogleSignIn);
if (id_token) { /* Possibly with more checks and validations */
console.log(id_token);
const response = yield call(HttpHelper, 'google_token', 'POST', id_token, null);
console.log(response);
}
} catch (e) {
console.log(e);
}
}
GoogleSignIn函数应该返回promise –