有效使用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;
}