带有布尔 return 函数的 Firestore 查询 returns undefined

Firestore query with a boolean return function returns undefined

这是我的 Firestore 功能:

export const keyExists = (setKey, keyExi) => {
  duettsRef
    .where("key", "==", setKey)
    .where("player2", "==", "")
    .where("player1", "!=", firebase.auth().currentUser.uid)
    .limit(1)
    .get()
    .then((querySnapshot) => {
      keyExi((querySnapshot) => !querySnapshot.empty );
      if (!querySnapshot.empty) {
        querySnapshot.docs[0].ref.update({
          player2: firebase.auth().currentUser.uid,
        });
      }
    })
    .catch((e) => console.log(e));
};

它工作正常。只有 keyExi((querySnapshot) => !querySnapshot.empty ); 返回未定义,当我在另一个 .js 文档中这样调用它时:

    const MainScreen = () => {
     const [keyExisting, keyExi] = useState(null);
    return (
    ...
      <CreatedButton
                    text="Apply"
                    onPress={() => {
                      keyExists(code,keyExi)
                      if (keyExisting == true) {
                        Alert.alert(
                            "Game joined"
                          );
                      } else if (keyExisting == false){
                        Alert.alert(
                          "Game does not exist or someone has already joined"
                        );
                       
                      }
                    }}
                  />
    ...
)

我做错了什么?

在您的代码中,您将 函数 传递给 keyExi:keyExi((x) => ! x.empty))。在您的代码中,您使用名称 querySnapshot 作为函数的参数,但实际上它与我编写的代码相同。

问题是您的函数定义正在声明函数中使用的新 querySnapshot 变量...它没有使用名为 现有的 变量 querySnapshot.

我怀疑您想做的是将该行更改为:keyExi(! querySnapshot.empty)

您不想将函数传递给 keyExi。您要传递计算值 !querySnapshot.empty.

顺便说一句:我总是向我的开发人员推荐我们使用命名方案的状态变量:const [keyExisting, setKeyExisting] = useState()。这样,我所有的“状态变量的设置函数”就很容易识别了。函数名称是状态变量名称的不同排列(或更糟...完全独立的名称)会导致调试和维护困难。