代码之家  ›  专栏  ›  技术社区  ›  rendom

在AuthStateChanged eventChannel上的Redux saga firebase

  •  2
  • rendom  · 技术社区  · 6 年前

    如何处理redux saga中的firebase auth state observer?

    firebase.auth().onAuthStateChanged((user) => {
    
    });
    

    我想跑 APP_START 我的应用程序启动时的传奇 firebase.auth().onAuthStateChanged 并将根据回调运行其他传奇。

    据我所知 事件频道 是正确的方法。但我不知道该怎么做 firebase.auth().onAuthStateChanged .

    有人能教我怎么 firebase.auth().onAuthStateChanged 进入事件频道?

    2 回复  |  直到 6 年前
        1
  •  7
  •   vahissan    6 年前

    你可以用 eventChannel . 下面是一个示例代码:

    function getAuthChannel() {
      if (!this.authChannel) {
        this.authChannel = eventChannel(emit => {
          const unsubscribe = firebase.auth().onAuthStateChanged(user => emit({ user }));
          return unsubscribe;
        });
      }
      return this.authChannel;
    }
    
    function* watchForFirebaseAuth() {
      ...
      // This is where you wait for a callback from firebase
      const channel = yield call(getAuthChannel);
      const result = yield take(channel);
      // result is what you pass to the emit function. In this case, it's an object like { user: { name: 'xyz' } }
      ...
    }
    

    完成后,可以使用 this.authChannel.close() .

        2
  •  2
  •   Andrei Zgîrvaci    6 年前

    创建自己的函数 onAuthStateChanged() 这将返回一个 Promise

    function onAuthStateChanged() {
      return new Promise((resolve, reject) => {
        firebase.auth().onAuthStateChanged((user) => {
          if (user) {
            resolve(user);
          } else {
            reject(new Error('Ops!'));
          }
        });
      });
    }
    

    然后使用 call 方法获取 user 同步地

    const user = yield call(onAuthStateChanged);