Node.js 在Firestore查询中使用Promise.all

Node.js 在Firestore查询中使用Promise.all,node.js,firebase,google-cloud-firestore,google-cloud-functions,es6-promise,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,Es6 Promise,我有一个HTTP云函数,可以查询和更新Firestore中的文档。基本上,该功能所做的是从一个集合中选择所有车辆,计算不同时间范围(24小时、12小时和6小时)的每辆车辆的能源使用情况,汇总结果并用结果更新另一个集合 这就是我的Firestore的结构 vehicles (collection) ----vehicle (document) -----telemetry (subcollection) this is where the energy values will come f

我有一个HTTP云函数,可以查询和更新Firestore中的文档。基本上,该功能所做的是从一个集合中选择所有车辆,计算不同时间范围(24小时、12小时和6小时)的每辆车辆的能源使用情况,汇总结果并用结果更新另一个集合

这就是我的Firestore的结构

vehicles (collection)
----vehicle (document)
    -----telemetry (subcollection) this is where the energy values will come from
这是到目前为止我的脚本,我正在使用Promise.all来组合不同时间范围的所有查询,计算每辆车的能源使用量,并将其添加到运行总数中,但这并不奏效

exports.getAllEnergyUsage = functions.https.onRequest((req, res) => {

  const store = admin.firestore()
  store.collection('vehicles').get().then(snapshot => {

    let allYesterdayResult = 0;
    let allTwelveHourResult = 0;
    let allSixHourResult = 0;

    snapshot.forEach(doc => {
      const data_dict = doc.data();
      let queryResults = [];
      const vehicle = data_dict.vehicle_name;
      const vehicleRef = store.collection('vehicles').doc(vehicle);
      const today = new Date();
      const yesterday = new Date(today.getTime() - (24*60*60*1000));
      const twelveHours = new Date(today.getTime() - (12*60*60*1000));
      const sixHours = new Date(today.getTime() - (6*60*60*1000));

      // console.log(today, sixHours);

      var queries = [
        vehicleRef.collection('telemetry').where('time_stamp', '<', today).where('time_stamp', '>', yesterday).get(),
        vehicleRef.collection('telemetry').where('time_stamp', '<', today).where('time_stamp', '>', twelveHours).get(),
        vehicleRef.collection('telemetry').where('time_stamp', '<', today).where('time_stamp', '>', sixHours).get()
      ]

      for (var i = 0; i < queries.length; i++) {
        queryResults.push(
          queries[i]
        )
      }

      Promise.all(queryResults)
        .then(snapShot=> {

          const yesterdayResult = result => getEnergy(result);
          const twelveHourResult = result => getEnergy(result);
          const sixHourResult = result => getEnergy(result);

          allYesterdayResult += yesterdayResult(snapShot[0])
          allTwelveHourResult += twelveHourResult(snapShot[1])
          allSixHourResult +=sixHourResult(snapShot[2])


          console.log("Done updating vehicle ", vehicle)
          // return res.send({"Result" : "Successful!"})
        }).catch(reason => {
          console.log(reason)
          // return res.send({"Result" : "Error!"})
      });



    })
    var vehicle_summary = {
      yesterday : allYesterdayResult,
      twelveHourResult : allTwelveHourResult,
      sixHourResult : allSixHourResult,
      timestamp : FieldValue.serverTimestamp()

    }
    console.log(vehicle_summary);
    store.collection('vehicles_summary').doc('energy').set(vehicle_summary);
  })

return res.send({"Result" : "Successful!"})


});

你知道我该怎么做吗?我来自Python,刚刚学习node.js,我仍然在同步思考

在任何异步工作完成之前返回一个结果:

return res.send({"Result" : "Successful!"})
发送此响应后,将终止函数。不能保证在此点之后的任何异步工作都会以您期望的方式完成


对于HTTP函数,您应该仅在所有异步工作完全完成后发送响应。

如何确定所有异步工作是否完成?根据我的代码,对于每个文档,我都运行一个承诺。所有。是的,您需要一个代表所有工作的承诺。将它们全部收集到一个数组中,并使用整个列表中的Promise.all。再次声明:在返回响应之前,您实际上并没有等待任何工作完成。试着简化你的工作,先把它做好,然后把它复杂化,以满足所有的要求。把所有的查询放在一个承诺中的问题。我不知道如何识别哪个查询是24小时、12小时还是6小时。因为我必须根据这些时间范围总结结果。和
promise.all
据我所知,只接受数组,如果我可以使用对象并将其传递给
promise.all
就像这样。
{“24小时”:query,“12小时”:query,“6小时”:query}
所以当
promise.all
完成时,我可以引用键来确定时间范围。@essramos Promise.all将按照已解析查询添加到数组中的顺序返回已解析查询
return res.send({"Result" : "Successful!"})