Javascript 如何在执行下一个lline之前评估firestore查询
我有一个函数,可以返回给定集合中的文档数据列表Javascript 如何在执行下一个lline之前评估firestore查询,javascript,node.js,firebase,firebase-realtime-database,google-cloud-firestore,Javascript,Node.js,Firebase,Firebase Realtime Database,Google Cloud Firestore,我有一个函数,可以返回给定集合中的文档数据列表 function _getPrevActivity(){ let historyCollectionRef = firestore.collection("/users/RSgNDLPxT2aAERQutXEEyhHHJYk1/agreements/DkRdZ5kHi2g7MlBV3Kjq/test/test-something/records/15/history"); let value = []; let wait; histor
function _getPrevActivity(){
let historyCollectionRef = firestore.collection("/users/RSgNDLPxT2aAERQutXEEyhHHJYk1/agreements/DkRdZ5kHi2g7MlBV3Kjq/test/test-something/records/15/history");
let value = [];
let wait;
historyCollectionRef.orderBy('timeStamp').onSnapshot(querSnap => {
querSnap.forEach(doc => {
value.push(doc.data())
console.log(value.length, " length")
})
console.log(value)
return value;
});
return value;
}
此函数始终返回[]
,然后执行firestore查询
PS:我是Node env的新手,我编写函数的方式可能也有问题 处理异步调用就像处理同步编程一样,这是一个典型的错误 我将您的代码重组如下:
function _getPrevActivity() {
let value = [];
let wait;
const path = "/users/RSgNDLPxT2aAERQutXEEyhHHJYk1/agreements/DkRdZ5kHi2g7MlBV3Kjq/test/test-something/records/15/history";
return firestore.collection(path).orderBy('timeStamp')
.onSnapshot(querSnap => {
querSnap.forEach(doc => {
value.push(doc.data())
console.log(value.length, " length")
});
console.log(value)
return value;
}).catch(error => {
console.log(error);
return value;
});
}
// calling function
function otherFunc() {
_getPrevActivity().then(value => {
// do something with value...
// value will not be an empty array now
console.log(value);
}).catch(console.log);
}
您在这里所犯的错误是,您不能真正从匿名函数querysnap=>{…
返回值,除非您还从希望返回值的函数返回封闭承诺
此外,要访问异步调用的
返回值
,需要使用then()
子句,我已经添加到下面的代码中。onSnapshot
立即返回,这意味着您的函数将返回其原始值的value
不变。您传递的回调将在一段时间后,当查询结果准备好时被调用。换句话说,您不能只返回onSnapshot
让函数返回异步生成的值。还要记住,对onSnapshot的回调可能会被调用多次,每次对文档进行更改一次。如果只需要一个值,请使用get()
取而代之。这太令人伤心了,所以如果不更改firestore api就无法实现这一点?我已将onSnapshot
更改为get
。带有承诺的异步编程(如get()
返回的承诺)在javascript和node中非常常见。你真的无法避免它。读过这篇文章后,这很有意义,只需要在我的端进行重构。我尝试了这一点,但在otherFunc
中抛出错误,\u getPrevActivity)(…)。那么这不是一个函数吗?你使用了正确的语法吗?它是\u getPrevActivity()。然后呢(值)
而不是\u getPrevActivity)(…)。然后
您在评论中写的内容。