Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用Redux绑定Firebase_Javascript_Firebase_Firebase Realtime Database_Redux_React Redux - Fatal编程技术网

Javascript 用Redux绑定Firebase

Javascript 用Redux绑定Firebase,javascript,firebase,firebase-realtime-database,redux,react-redux,Javascript,Firebase,Firebase Realtime Database,Redux,React Redux,我正在用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({ t

我正在用
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
    没有实现promises接口
    
  • 我不想在
    fetchUser
    操作中移动后续操作,因为其他组件也可以出于其他目的调用
    fetchUser

我觉得这应该是直截了当的,但我对redux和firebase都是新手,所以我们非常感谢您的帮助。

您没有从firebase获得承诺这一事实似乎不是您的问题。您可以在action creator中返回承诺,然后使用该承诺的解析启动
。然后()
组件willmount()
中。我们做过这样的事情:

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获得承诺,可以使用。这实际上可能对您更有效,因此您在
/users
ref上没有一个永久的侦听器。

您没有从firebase获得承诺这一事实似乎不是您的问题。您可以在action creator中返回承诺,然后使用该承诺的解析启动
。然后()
组件willmount()
中。我们做过这样的事情:

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获得承诺,可以使用。这实际上可能更适合您,因此您在
/users
ref.

“一个问题是Firebase on event listener没有实现承诺接口。”
on()
可以多次触发,承诺只能解决一次。
on()
不可能是承诺。如果您只关心一个值,请使用
once()
,它会返回一个承诺。@FrankvanPuffelen我同意并理解这一点。然而,我仍然希望在组件中每次触发
on
时都有一个回调,这样我就可以触发另一个操作。使用
react-redux
,我可以将其作为对
道具的更改,但这感觉不太正确。@FrankvanPuffelen我发现让firebase使用redux非常困难(tbh:)直接打开了一个问题:这个示例可能很有用:“一个问题是firebase on事件侦听器没有实现承诺接口。”
on()
可以触发多次,承诺只能解决一次。
on()
不可能是承诺。如果您只关心一个值,请使用
once()
,它会返回一个承诺。@FrankvanPuffelen我同意并理解这一点。然而,我仍然希望在组件中每次触发
on
时都有一个回调,这样我就可以触发另一个操作。使用
react redux
,我可以将其作为对
道具的更改来获得,但这感觉不太正确。@frankvanpoffelen我发现让firebase使用redux非常困难(tbh:)直接打开了一个问题:这个示例可能很有用:这行不通<代码>打开
可以多次开火
resolve
不会在第一次调用之后的所有调用中都起作用,因为承诺已被解析。是否每次要获取值时都调用
fetchUser
操作?如果是这样的话,这应该完全符合您的要求。我们正在生产应用程序中使用此模式,它完全按照预期工作。我建议你尝试一下,而不是仅仅说它不起作用。这不起作用<代码>打开
可以多次开火
resolve
不会在第一次调用之后的所有调用中都起作用,因为承诺已被解析。是否每次要获取值时都调用
fetchUser
操作?如果是这样的话,这应该完全符合您的要求。我们正在生产应用程序中使用此模式,它完全按照预期工作。我建议你试试,而不是说它不管用。