[英]Trouble understanding doc().get() in firebase
我在理解為什么我的代碼無法正常工作時遇到了一些麻煩。 我正在嘗試從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
放在該塊之外,則它將在該塊之前執行,而tmp
尚未初始化。 從數據庫獲取FirstName
的代碼( get()
函數)在另一個線程中執行一些代碼,並且原始線程繼續運行而無需等待其完成。 當另一個線程完成執行時,將執行該塊中的代碼。 您可以通過在塊之前,內部和之后添加alert
來查看執行的順序,從而驗證此行為。 要了解更多信息,請閱讀異步操作和Promise 。
為什么所有這些? 為什么get()
在另一個線程中執行一些代碼? 簡而言之,因為它使用網絡訪問Firebase數據庫,並且可能需要一些時間才能返回響應。 如果get()
在同一調用線程中執行“網絡代碼”,則從主線程(UI線程)進行調用將使您的UI無響應,直到響應返回。 因此,相反, get()
將“網絡代碼”調度到另一個線程,並甚至在“網絡代碼”完成執行之前立即返回一個promise
對象。 您可以使用該promise
對象指定結果到達時要處理的內容。 這樣,調用線程將繼續執行並且無需等待,並且在調用線程是UI線程的情況下(通常是這種情況),這意味着您的UI始終是響應性的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.