1

我試圖利用REDX-SAGO框架內的firebase observable,但是我無法在沒有黑客的情況下執行此操作。我試圖用火力的「onAuthStateChange」功能如下所示將觀察者傳遞給REDEX-SAGO

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

主要觀察者執行時或縮小

在我火力實用程序文件我的方法的用戶登錄看起來是這樣的:

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身份驗證對象傳遞給我的登錄/註銷傳奇,然後在那裏創建觀察者。這有效,但似乎是一個黑客。任何幫助將非常感激。

+0

不應該'authChanged'已'callback'作爲參數? '回調'應該來自哪裏? –

回答

0

看起來你似乎有callback作爲authChanged的參數,但authChanged目前沒有參數。以下是你可能是指做:

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

我不知道我明白你的討好觀察者的意思,但你也可以做這樣的事情討好的火力方法,你的方法使用方法:

{ 
    authChanged: ::firebaseAuth.onAuthStateChanged, 
} 
1

我不認爲你實際上是在你的代碼片段中將observer整合到saga中。它將適用於console.log b/c這是一個同步功能,但您不能從該回調中撥出yield任何東西,因爲其上下文與generator分開。這剝奪了你的許多sagas工具,如果它工作@ all。

我不得不在我的項目中工作,我能做的最好的啓發是this projectthis starter-kit的架構。

基本上,這是幾個步驟。

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