簡體   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