如何使值返回到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)
在函数之外,所以我无法获得它的值。请问我如何在函数外调用它(如果可能)。
答案 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的答案,异步与性能。