【发布时间】:2018-10-07 09:59:37
【问题描述】:
我有一个函数应该返回给定集合中的文档数据列表。
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 环境的新手,我编写函数的方式也可能有问题。
【问题讨论】:
-
onSnapshot立即返回,这意味着您的函数将返回value与其原始值保持不变。您传递给onSnapshot的回调将在稍后查询结果准备好时被调用。换句话说,你不能只让一个函数返回一个异步产生的值。 stackoverflow.com/questions/14220321/… -
还请记住,对 onSnapshot 的回调可能会被调用多次,每次更改文档时调用一次。如果您只需要一个值,请改用
get()。 -
嗯,这很可悲,所以如果不更改 firestore api,就没有办法实现这一点吗?我已将
onSnapshot更改为get。 -
带有 promise 的异步编程(如
get()返回的那些)在 javascript 和 node.js 中非常常见。你真的无法避免。 medium.com/google-developers/… -
嗯,看完文章说的有道理,只需要我自己重构一下
标签: javascript node.js firebase firebase-realtime-database google-cloud-firestore