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)(…)。然后
您在评论中写的内容。