为什么Kotlin在消防队呼叫中跳过这段代码



我有这个代码来检查firestore 中是否已经存在用户

1  private fun usernameRepeated(db: FirebaseFirestore, username: String): Boolean {
2      var res = false
3      db.collection("User").whereEqualTo("username", username).get().addOnSuccessListener { task ->
4          res = task.documents.isNotEmpty()
5      }
6      return res
7  }

但它不起作用。我已经调试了在第2、4和6行设置断点的代码。当调试器到达这一点时,它正确地运行第2行和第3行,但跳过第4行,直接转到第6行,总是返回"0";false";。在运行完我调用这个函数的其余行很长一段时间后,它会返回并只运行第4行,此时已经太晚了。

它不会跳过该部分,而是仅在从数据库检索结果时异步执行。

实际情况是,该方法返回False,然后才执行回调。

您应该传递一个回调,而不是返回结果

private fun usernameRepeated(db: FirebaseFirestore, username: String, onSuccess: (result: Task) => Boolean): Boolean {
db.collection("User").whereEqualTo("username", username).get().addOnSuccessListener { onSuccess }
}

或者,您可以使用协程、RxJava或其他API 来阻止请求

最新更新