如何在执行下一个lline之前评估firestore查询

时间:2018-04-26 16:00:28

标签: javascript node.js firebase firebase-realtime-database google-cloud-firestore

我有一个函数应该返回给定集合中的文档数据列表。

+--------+----+--------------------+
|iD      |val |Code                |
+--------+----+--------------------+
|001     |044 |9022070536692784476 |
|002     |066 |-5138930048185086175|
|003     |025 |805582856291361761  |
|004     |017 |-9107885086776983000|
|005     |018 |1993794295881733178 |
|006     |031 |-2867434050463300064|
|007     |088 |-4692317993930338046|
|008     |044 |-4039776869915039812|
|009     |020 |-5786627276152563542|
|0010    |012 |7614363703260494022 |
+--------+----+--------------------+

}

此函数始终返回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的新手,我写这个函数的方式可能也有问题。

1 个答案:

答案 0 :(得分:0)

您正在处理异步调用的经典错误,就像使用同步编程一样。

我重新编写了您的代码,如下所示:

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);
    }

你在这里犯的错误是你不能真正从匿名函数querSnap => {...返回一个值,除非你还从你希望返回值的函数中返回封闭的promise。

此外,要从异步调用的return访问值,需要使用我已添加到下面代码中的then()子句。