繁体   English   中英

有效使用异步/等待

[英]efficient use of 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数组按第4个索引进行拆分将得到我想要的结果,但我正在寻找更好的选择。

如果要并行运行所有查询,则实际上不会在循环中使用await 但是,您不需要将所有的Promise放在同一数组中,然后每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;
}

我认为您的做法是有效的。 您正在利用异步电位。 我认为如果将所有诺言放到一个数组中并等待所有诺言会更有效。 在那种情况下,我看不到一种方法来恢复作业ID和每个诺言的结果之间的关联。 您可以重构所有重复的行,但这确实是关于干净的代码,而不是效率。 这可能是第一种方法:

var executeQuery = function(list) {
    const subArray = [];
    for(let element of list) {
       const rel = new Parse.Relation(jb, element);
       subArray.push(rel.query().containedIn('objectId', uniqUserIds).select('objectId').find())
    };
    return subArray;
}

for (let jb of jobList ) {
    values[jb.id] = values[jb.id] || {};
    var subArray = executeQuery(['applicants', 'shortlisted', 'hired', 'rejected']);
    values[jb.id] = await Promise.all(subArray);
}

也许您可以在这里使用Q库来实现您的承诺。 有了这个库,您可以轻松地合并和链接您的承诺。

希望这可以帮助!

亲切的问候。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM