我有此代码:
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状态。
答案 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);