簡體   English   中英

在Firebase中難以理解doc()。get()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM