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
操作?如果是这样的话,这应该完全符合您的要求。我们正在生产应用程序中使用此模式,它完全按照预期工作。我建议你试试,而不是说它不管用。