我无法理解为什么我的代码无法工作。我正在尝试从 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 operations和promises .
为什么这一切?为什么 get()
在另一个线程中执行某些代码?简而言之,因为它使用网络访问 Firebase 数据库,可能需要一些时间才能收到响应。如果 get()
在同一调用线程中执行“网络代码”,则从主线程(UI 线程)调用它将使您的 UI 无响应,直到响应返回。因此,get()
将“网络代码”分派(dispatch)到另一个线程,并在“网络代码”完成执行之前立即返回一个 promise
对象。您可以使用该 promise
对象来指定您希望在结果到达时对其执行的操作。这样,调用线程就会继续执行,不需要等待,并且在调用线程是 UI 线程的情况下(通常是这种情况),这意味着您的 UI 始终是响应式的。
关于javascript - 无法理解 firebase 中的 doc().get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57067478/