javascript - 无法理解 firebase 中的 doc().get()

标签 javascript firebase google-cloud-firestore react-native

我无法理解为什么我的代码无法工作。我正在尝试从 react native 项目内的 firebase 读取数据。我可以很好地阅读它,但我无法将数据设置为任何变量。

这是我的代码。

let tmp;
    let userRef = firebase.firestore().collection("Users");

    userRef.doc(this.state.FirstName).get().then((document) => { 
      tmp = document.data().FirstName;
      alert(tmp);
    })
    .catch((errorMsg) => {
      alert(errorMsg);
    })
    alert("tmp Data: " + tmp);
  };

问题是,如果我在函数内部提醒 tmp ,它会按预期显示 FirstName 变量。但是当我在函数外部警告 tmp 时,它显示未定义。我似乎无法理解为什么这不起作用,如果有人能告诉我我在这里做错了什么,我将非常感激。

最佳答案

这是完全正常的。发生这种情况是因为如果您将 alert 放在 block 之外,那么它将在 block 之前执行,而 tmp 未初始化。从数据库获取 FirstName 的代码(get() 函数)会在另一个线程中执行一些代码,并且原始线程会继续执行,而不等待其完成。当另一个线程完成执行时, block 内的代码将被执行。您可以通过在 block 之前、内部和之后添加警报来验证此行为,以查看执行顺序。要了解更多信息,请阅读 asynchronous operationspromises .

为什么这一切?为什么 get() 在另一个线程中执行某些代码?简而言之,因为它使用网络访问 Firebase 数据库,可能需要一些时间才能收到响应。如果 get() 在同一调用线程中执行“网络代码”,则从主线程(UI 线程)调用它将使您的 UI 无响应,直到响应返回。因此,get() 将“网络代码”分派(dispatch)到另一个线程,并在“网络代码”完成执行之前立即返回一个 promise 对象。您可以使用该 promise 对象来指定您希望在结果到达时对其执行的操作。这样,调用线程就会继续执行,不需要等待,并且在调用线程是 UI 线程的情况下(通常是这种情况),这意味着您的 UI 始终是响应式的。

关于javascript - 无法理解 firebase 中的 doc().get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57067478/

相关文章:

javascript - 如何在 JavaScript 中使用 MDCSlider?

python - FCM API 'Bad request 400' 错误

javascript - Firebase 函数返回

javascript - 文档已创建但响应为空

javascript - PhoneGap Android 查询字符串问题

javascript - d3.js 上传到 bl.ocks.org 时动态高度变化

javascript - jQuery 想要覆盖按钮单击的功能

firebase - 如何使用 firestore 运行 geo "nearby"查询?

javascript - 单击按钮时不会从 firebase 中删除文档(onclick 方法)

firebase - 在 typescript 中部署Firebase云功能