我一直在写我的React / Rediux / Firebase应用程序一段时间(开始于1年前,但是这段时间我休息了几个月,所以我可以从时间的角度审阅自己的代码)。 现在,我再次检查代码,并且感到直觉不是最新技术。
我也在使用Firebase来管理帐户,在这种情况下,我是用来创建新帐户的。
我将与创建用户和错误处理有关的所有动作链放在Actions / index.js的一个功能块中。
export const signUpUser = (data) => dispatch => {
Firebase.auth().createUserAndRetrieveDataWithEmailAndPassword(data.email, data.password)
.then(response => {
const userId = Firebase.auth().currentUser()
getUserInfoRef(userId).set({
uid: userId,
isAdmin: false
})
})
.then(response => {
Firebase.auth().currentUser().updateProfile({
displayName: `${data.name} ${data.surname}`
})
})
.then(() => {
dispatch(sendEmailVerification())
})
.catch(error => {
console.log('Error during signUpUser', error)
dispatch(authError(error))
})
}
但这是一个好方法吗? 难道不是从体内派遣某种反模式吗? 也许应该以某种方式将其拆分(如何?)?
它正在工作,但是看起来不满意:) 请提出建议。
答案 0 :(得分:0)
我没有发现您的代码有任何问题。只要您在then
中使用诺言,catch
块就必须在其中分发。
但是,如果您仍然希望它看起来更好,我建议您像这样使用async/await
:
export const signUpUser = (data) => async dispatch => {
try {
await Firebase.auth().createUserAndRetrieveDataWithEmailAndPassword(data.email, data.password)
const userId = await Firebase.auth().currentUser()
getUserInfoRef(userId).set({
uid: userId,
isAdmin: false
}) // am not sure if this func is async or not
await Firebase.auth().currentUser().updateProfile({
displayName: `${data.name} ${data.surname}`
})
dispatch(sendEmailVerification())
} catch(e) {
console.log('Error during signUpUser', error)
dispatch(authError(error))
}
}
PS:很高兴看到SO要求人们在这里“好”。我认为非常需要。