2016-12-27 1 views
0

J'essaie d'implémenter Google OAuth 2 avec redux saga.Comment gérer le flux Google OAuth via redux-saga

J'ai un guetteur dans ma saga écoute pour une action GOOGLE_AUTH qui exécute alors 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); 
} 

La mise en œuvre pour GoogleSignIn est en 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) 
     } 
    ) 
} 

Mais la saga ne semble pas attendre la GoogleSignIn pour terminer. Dès que l'écran de consentement OAuth apparaît, saga procède à l'exécution du console.log sans attendre que google signin promette de retourner les données réelles.

Existe-t-il une meilleure façon de gérer cette situation? Merci!

+1

Fonction GoogleSignIn devrait retourner la promesse –

Répondre

1

Pour développer la réponse de @ HenrikR, le générateur n'attendra pas à moins qu'il ne reçoive une promesse. En conséquence, vous devriez envelopper l'instruction yield dans un try/catch. Simplifié et un peu paresseux:

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); 
    } 
}