如何使Firestore中的数据成为全局变量?

时间:2019-11-27 10:39:33

标签: javascript firebase google-cloud-firestore

如何使值返回到onSnapshot函数之外?

function checkIfExisting(){

  const collection = firebase.firestore().collection("audit");
  const getCaseID = collection.where("caseID", "==", "00001234");

  getCaseID.onSnapshot(function(querySnapshot) {
    let wordLists = [];
    querySnapshot.forEach(function(doc) {
    //get all the scanned words under "word" field in the Firestore Database
        wordLists.push(doc.data().word);
    });

    console.log("words: ", wordLists);// return a value

  });

  console.log("words1: ", wordLists);// undefined

  }

我知道console.log("words1: ", wordLists)在函数之外,所以我无法获得它的值。请问我如何在函数外调用它(如果可能)。

2 个答案:

答案 0 :(得分:2)

要在外部访问它,可以使用Promise

function checkIfExisting(){
  return new Promise((resolve, reject) => {
   const collection = firebase.firestore().collection("audit");
   const getCaseID = collection.where("caseID", "==", "00001234");

   getCaseID.get().then(function(querySnapshot) {
     let wordLists = [];
     querySnapshot.forEach(function(doc) {
     //get all the scanned words under "word" field in the Firestore Database
        wordLists.push(doc.data().word);
          resolve(wordLists);
     });
     console.log("words: ", wordLists);// return a value
  });

然后访问外部,请执行以下操作:

checkIfExisting().then((result) => {
   console.log(result);
});

result将包含wordLists

检查以下内容以获取更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

答案 1 :(得分:0)

您的变量wordLists是在传递给let的回调(函数)中定义的(通过使用onSnapshot)。即使忽略了这是一个异步操作(Peter的答案使用Promise解决了这一事实)的事实,您也无法访问该函数外部的函数中定义的变量。

您可以了解有关变量作用域here on SO, quick n dirty的信息,或者在Kyle出色的您不了解JavaScript 系列的书籍中,该系列是available freely on github或印刷版。第2部分,范围和结束语。 另外,要真正理解Peter的答案,异步与性能