为什么抛出错误会记录错误:未捕获....(错误消息)?

时间:2018-10-31 15:42:41

标签: javascript reactjs firebase

我有此代码:

export const checkIfUsernameExists = username => 
    db.child(username).once("value", snap => 
        {if(snap.exists()) throw "Username already in use"})

如果我叫它(在另一个文件中):

checkIfUsernameExists(username)
    .catch(err => this.setState({err})

之所以起作用,是因为它引发了错误,但不是正确的方法。它记录:Uncaught Username already in use到控制台,但是我想将此消息设置为React状态。

1 个答案:

答案 0 :(得分:0)

checkIfUsernameExists的当前实现使用firebase.database.Query#once的回调签名变体。

您要使用Promise变体来应用Promise样式错误处理。

db.child(username)
  .once("value")
  .then(snap => {
     if(snap.exists()) {
        throw Error("Username already in use");
     }
  })

如果要保留当前的回调样式,另一种方法是重构checkIfUsernameExists以接受回调。

export const checkIfUsernameExists = username, cb => 
    db.child(username).once("value", cb)

假设您在组件中定义了onUsernameExists方法。

const USERNAME_IN_USE = "Username already in use";
//...
onUsernameExists = snap => {
   if(snap.exists()) {
     this.setState(() => ({errText: USERNAME_IN_USE})) 
   }
}

然后可以这样调用checkIfUsernameExists

checkIfUsernameExists(username, this.onUsernameExists);
相关问题