在react-redux应用程序中处理Firebase用户创建流程的正确方法是什么

时间:2018-11-04 08:04:08

标签: reactjs firebase redux

我一直在写我的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))
    })
}

但这是一个好方法吗? 难道不是从体内派遣某种反模式吗? 也许应该以某种方式将其拆分(如何?)?

它正在工作,但是看起来不满意:) 请提出建议。

1 个答案:

答案 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要求人们在这里“好”。我认为非常需要。