最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

有效使用asyncawait

运维笔记admin17浏览0评论

有效使用async / await

有效使用async / await

我知道循环中的await非常气馁。但我坚持一个特定的案例,我无法弄清楚如何有效地做到这一点。我想要像这样的变量values的最终输出

{
  jobId1: [[..], [..], [..], [..]],
  jobId2: [[..], [..], [..], [..]] // list goes on
}

以下代码段代表我当前的实现。

for (let jb of jobList ) {
  const subArray = []
  const rel1 = new Parse.Relation(jb, 'applicants')
  const rel2 = new Parse.Relation(jb, 'shortlisted')
  const rel3 = new Parse.Relation(jb, 'hired')
  const rel4 = new Parse.Relation(jb, 'rejected')
  subArray.push(rel1.query().containedIn('objectId', uniqUserIds).select('objectId').find())
  subArray.push(rel2.query().containedIn('objectId', uniqUserIds).select('objectId').find())
  subArray.push(rel3.query().containedIn('objectId', uniqUserIds).select('objectId').find())
  subArray.push(rel4.query().containedIn('objectId', uniqUserIds).select('objectId').find())

  values[jb.id] = await Promise.all(subArray)
}

我可以把所有的承诺推到一个单一的阵列中等待所有。但是我失去了承诺价值属于哪个职业ID的轨道。虽然按照每个第四个索引分割整个await数组会得到我想要的东西,但我正在寻找更好的选择。

回答如下:

如果你想并行运行所有查询,你确实不会在循环中使用await。但是,您不需要将所有承诺放在同一个数组中,然后分成每4个值 - 只需使用适当的嵌套结构!

function query(jb, name) {
  const rel = new Parse.Relation(jb, name);
  return rel.query().containedIn('objectId', uniqUserIds).select('objectId').find();
}
async function getValues(jobList) {
  const promises = jobList.map(jb =>
    Promise.all([
      jb.id,
      query(jb, 'applicants'),
      query(jb, 'shortlisted'),
      query(jb, 'hired'),
      query(jb, 'rejected'),
    ])
  );
  const results = await Promise.all(promises);
  const values = {};
  for (const [id, ...res] of results)
    values[id] = res;
  return values;
}

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论