有效使用 async/await
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)
}
我可以将所有 promise 放入一个数组中并等待所有。但是我会丢失 promise 值属于哪个 job id 的轨迹。虽然将整个 await 数组按每 4 个索引拆分会得到我想要的,但我正在寻找更好的选择。
也许您可以使用 Q-library 来实现您的承诺 here。
使用此库,您可以轻松组合和链接您的承诺。
希望对您有所帮助!
亲切的问候。
我觉得你的做法很有效率。您正在利用异步潜力。我不认为将所有承诺放在一个数组中并等待所有承诺会更有效率。在那种情况下,我看不到恢复作业 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);
}
如果您想 运行 并行查询所有查询,您确实不会在循环中使用 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;
}
我知道 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)
}
我可以将所有 promise 放入一个数组中并等待所有。但是我会丢失 promise 值属于哪个 job id 的轨迹。虽然将整个 await 数组按每 4 个索引拆分会得到我想要的,但我正在寻找更好的选择。
也许您可以使用 Q-library 来实现您的承诺 here。 使用此库,您可以轻松组合和链接您的承诺。
希望对您有所帮助!
亲切的问候。
我觉得你的做法很有效率。您正在利用异步潜力。我不认为将所有承诺放在一个数组中并等待所有承诺会更有效率。在那种情况下,我看不到恢复作业 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);
}
如果您想 运行 并行查询所有查询,您确实不会在循环中使用 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;
}