3

redux-sagas フレームワーク内から監視可能な firebase を活用しようとしていますが、ハックなしではこれを行うのに問題があります。ここに示すように、firebaseの「onAuthStateChange」関数を使用しようとしています

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

基本的に、オブザーバーは、ユーザーがサインインまたはサインアウトするたびに実行されます

私のfirebaseユーティリティファイルでは、私のメソッドは次のようになります:

authChanged: () =>{
    return firebaseAuth.onAuthStateChanged(callback);
}

それから私の物語では、今のところ、オブザーバーが何かを観察するたびにコンソールにログインしようとしています:

export function* loginState(){
    Firebaseutils.authChanged(function(user){
        if(user){
            console.log('User logged in!')
        }else{
            console.log('User logged out')
        }
    });
}

「コールバック」が定義されていないため、これは失敗します。私は本質的にオブザーバーをサガに渡すようにカレーしようとしていますが、うまくいきません。私の回避策は、完全な firebase auth オブジェクトをログイン/ログアウト サガに渡し、そこにオブザーバーを作成することです。それは機能しますが、ハックのようです。どんな助けでも大歓迎です。

4

2 に答える 2

2

スニペットの に実際に を統合しobserverているとは思いません。同期関数である b/c では機能しますがsaga、そのコンテキストは. @ all が機能する場合、これにより多くのユーティリティが奪われます。console.logyieldgeneratorsagas

私は自分のプロジェクトでこれを機能させる必要がありました。私ができる最善のことは、このプロジェクトとこのスターター キットのアーキテクチャに触発されたことです。

基本的に、それはいくつかのステップです。

  1. dispatchを受け取って返す関数でオブザーバーをラップしますpromise

    export function initAuth(dispatch) {
     return new Promise((resolve, reject) => {
    
    myFirebaseAuthObj.onAuthStateChanged(
      authUser => {
        if (authUser) {
          dispatch(signInFulfilled(authUser))
        } else if (authUser === null) {
          dispatch(signOutFulfilled())
        }
        resolve()
      },
    
      error => reject(error)
    )
    })
    }
    
  2. トップレベルのコンテナーを関数でラップする

    const initialState = window.___INITIAL_STATE__
    const store = createStore(initialState)
    let render = () => {
      const routes = require('./routes/index').default(store)
    
      ReactDOM.render(
        <AppContainer store={store} routes={routes} />,
        MOUNT_NODE
      )
    }
    
  3. ラップrender()インinitAuth:

    initAuth(store.dispatch)
      .then(() => render())
      .catch(error => console.error(error)) 
    
  4. あなたsagasを何か他のことに使ってください。たとえば、次のようにルート変更を行うことができますsagas

    function* signIn(authProvider) {
      try {
        const authData = yield call([firebaseAuth, firebaseAuth.signInWithPopup], authProvider)
        yield take(SIGN_IN_FULFILLED)
        browserHistory.push('/dash')
      }
      catch (error) {
        yield put(signInFailed(error))
      }
    }
    
于 2016-10-21T19:49:51.093 に答える
0

callbackパラメータとして持つつもりだったようですauthChangedが、authChanged現在はパラメータを取りません。おそらくあなたが意図したことは次のとおりです。

authChanged: (callback) => {
    return firebaseAuth.onAuthStateChanged(callback);
}

オブザーバーをカリー化することの意味を理解できるかどうかはわかりませんが、メソッドとして使用するfirebaseメソッドをカリー化するために次のようなことを行うこともできます:

{
    authChanged: ::firebaseAuth.onAuthStateChanged,
}
于 2016-09-15T05:03:10.103 に答える