首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象参数传递给Promise.all

将对象参数传递给Promise.all
EN

Stack Overflow用户
提问于 2018-04-24 01:51:50
回答 2查看 797关注 0票数 1

我有三个基于时间范围的Firestore查询。(24、12及6小时)。我正在使用Promise.all,它可以工作。从代码中可以看到,我使用返回快照的索引来访问每个查询的结果。我已经读到,无论完成顺序如何,返回的值都将按照所通过的承诺的顺序排列。

现在,我希望能够将一个对象传递给Promise.all,因为对于我想要做的事情,我的查询数量将是不可预测的,基本上,我将循环到许多车辆上,为每个车辆构建相同的3个查询,并且我将在一个Promise.all上传递它。当Promise.all返回时,我希望能够知道快照是用于哪个车辆和时间范围的。

因此,我想将这个参数传递给Promise.all,而不是数组。

代码语言:javascript
运行
复制
{"vehicle1_24":query, "vehicle1_12":query, "vehicle1_6":query,
"vehicle2_24":query, "vehicle2_12":query, "vehicle2_6":query}

代码

代码语言:javascript
运行
复制
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!"})
EN

Stack Overflow用户

回答已采纳

发布于 2018-04-24 07:39:29

此特性在本机不存在,但应该相当容易编写,类似于

代码语言:javascript
运行
复制
async function promiseAllObject(obj) {
  // Convert the object into an array of Promise<{ key: ..., value: ... }>
  const keyValuePromisePairs = Object.entries(obj).map(([key, valuePromise]) =>
    valuePromise.then(value => ({ key, value }))
  );

  // Awaits on all the promises, getting an array of { key: ..., value: ... }
  const keyValuePairs = await Promise.all(keyValuePromisePairs);

  // Turn it back into an object.
  return keyValuePairs.reduce(
    (result, { key, value }) => ({ ...result, [key]: value }),
    {}
  );
}

promiseAllObject({ foo: Promise.resolve(42), bar: Promise.resolve(true) })
  .then(console.log); // { foo: 42, bar: true }
票数 6
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49992313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档