代码之家  ›  专栏  ›  技术社区  ›  Faysal Ahmed

高效使用异步/等待

  •  0
  • Faysal Ahmed  · 技术社区  · 7 年前

    我知道 await 不鼓励使用in循环。但我被困在一个具体的案例中,我不知道如何有效地做到这一点。我想要变量的最终输出 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 . 虽然将整个等待数组按每4个索引进行拆分将得到我想要的,但我正在寻找更好的替代方案。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Bergi    7 年前

    如果您想并行运行所有查询,您确实不会使用 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;
    }
    
        2
  •  0
  •   David Vicente    7 年前

    我认为你的做法很有效率。您正在利用异步潜力。我不认为如果你把所有的承诺放在一个数组中,然后等待所有的承诺都放在一起,效率会更高。在这种情况下,我看不到恢复作业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);
    }
    
        3
  •  -1
  •   Jerico Moeyersons    7 年前

    也许你可以用Q库来实现你的承诺 here . 有了这个库,您可以轻松地组合和链接您的承诺。

    希望这有帮助!

    谨致问候。