【问题标题】:Binding Firebase with Redux将 Firebase 与 Redux 绑定
【发布时间】:2016-09-22 00:06:41
【问题描述】:

我正在使用firebase 构建一个react-redux 应用程序。

这是我的动作创建者:

export function fetchUser(uid) {
  let ref = firebase.database().ref('users/' + uid)
  return dispatch => {
    ref.on("value", (snapshot) => {
      let obj = snapshot.val()
      dispatch({
        type: FETCH_USER,
        payload: obj
      })
    })
  }
}

在我的 React 组件中,我希望能够链接它并连接另一个动作。所以像:

componentWillMount() {
      let userId = 'some user id'
      this.props.fetchUser(userId).then(()=> {
        this.props.updateUser() // perform another action after the fetch is complete
      })
}

我很难做到这一点。

  • 一个问题是Firebase on 事件监听器没有实现promises 接口。
  • 我不想将后续操作移动到 fetchUser 操作中,因为其他组件也可以出于其他目的调用 fetchUser

我觉得这应该是直截了当的,但我对 redux 和 firebase 都是新手,所以我们将不胜感激。

【问题讨论】:

  • “一个问题是事件监听器上的 Firebase 没有实现 Promise 接口。” on() 可以触发多次,一个promise 只能解析一次。 on() 不可能是一个承诺。如果您只关心单个值,请使用once(),它确实返回一个承诺。
  • @FrankvanPuffelen 我同意并理解这一点。但是,我确实希望每次在我的组件中触发on 时都进行回调,以便我可以触发另一个动作。使用react-redux,我可以将其更改为props,但这感觉不对。
  • @FrankvanPuffelen 我发现使 firebase 与 redux 一起工作非常困难 tbh :) 直接打开了一个问题:github.com/firebase/reactfire/issues/115

标签: javascript firebase firebase-realtime-database redux react-redux


【解决方案1】:

您没有从 firebase 返回 Promise 的事实似乎并不是您的问题。您可以在您的动作创建者中返回一个承诺,然后使用该解决方案在您的componentWillMount() 中启动.then()。我们做了这样的事情:

export function fetchUser(uid) {

  let ref = firebase.database().ref('users/' + uid);

  return dispatch => {
    return new Promise( ( resolve, reject ) => {
      ref.on("value", (snapshot) => {
        let obj = snapshot.val();
        dispatch({
          type: FETCH_USER,
          payload: obj
        });
        resolve();
      })
    });
  }
}

另外,如果你想要来自 firebase 的承诺,你可以使用.once()。这实际上可能对您更有效,因此您在 /users 参考上没有永久听众。

【讨论】:

  • 这行不通。 on 可以触发多次。 resolve 在第一次调用之后的所有调用中都不起作用,因为承诺已经解决。
  • 您是否在每次想要获取值时都调用fetchUser 操作?如果是这样,这应该完全符合您的要求。我们在我们的生产应用程序中使用这种模式,它完全按照预期工作。我建议您尝试一下,而不是仅仅说它不起作用。
猜你喜欢
  • 2018-11-09
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多