Я создаю скрипт для создания отчета по подпискам. Следующее объясняет процесс:
First Request: get all subscriptions (includes truncated subscriber list)
Second Request: loop through response, fetch complete recipient list for each subscription
Result: Compile report by collated all of the data into a single array
Проблема в том, что, поскольку я использую await, Promise & async
в моем коде (требуется для инструмента), CSV начинает сборку после массового GET, но до GET от получателей каждой отдельной подписки.
В результате я получаю список только из 600 (общее количество подписок), хотя на самом деле оно должно быть более 6000 (все подписки плюс всех получателей)
Как мне восстановить это так, чтобы функция util.buildCSV()
не запускалась до тех пор, пока все данные не будут возвращены и помещены в массив report
?
Важно для обратите внимание, что все функции запроса являются асинхронными c и могут выполняться только в самих асинхронных c функциях, что делает это довольно раздражающим и трудным.
CODE:
const fields = [
'sub_name',
'sub_uuid',
'form_name',
'form_id',
'plan_name',
'plan_id',
'owner_targetName',
'owner_firstName',
'owner_lastName',
'owner_uuid',
'applications',
'lob'
];
(async (env) => {
const report = []
const subscriptions = await xm.subscriptions.getMany(env);
await Promise.all(subscriptions.map(sub => {
let apps_and_lobs = xm.subscriptions.process_apps_and_lobs(sub.criteria.data);
let sub_obj = {
sub_name : sub.name,
sub_uuid : sub.id,
form_name : sub.form.name,
form_id : sub.form.id,
plan_name : sub.form.plan.name,
plan_id : sub.form.plan.id,
owner_targetName : sub.owner.targetName,
owner_firstName : sub.owner.firstName,
owner_lastName : sub.owner.lastName,
owner_uuid : sub.owner.id,
applications : apps_and_lobs.apps,
lob : apps_and_lobs.lobs
};
report.push(sub_obj);
if (sub.recipients && sub.recipients.count > 1) {
(async (env) => {
let recipients = await xm.subscriptions.getSubscribers(env, null, sub.id);
recipients.map(r => {
let recip_obj = {
sub_name : sub.name,
sub_uuid : sub.id,
form_name : sub.form.name,
form_id : sub.form.id,
plan_name : sub.form.plan.name,
plan_id : sub.form.plan.id,
owner_targetName : r.targetName,
owner_firstName : r.firstName,
owner_lastName : r.lastName,
owner_uuid : r.id,
applications : apps_and_lobs.apps,
lob : apps_and_lobs.lobs
};
report.push(recip_obj);
console.log(`> ${report.length}`); // runs after the below COMPLETE > console log showing its breaking in async
})
})(env)
} else {
console.log(`> ${report.length}`);
}
})).then((thing) => {
util.cmt(`COMPLETE > ${report.length}`);
util.buildCSV(fields, report, 'subscriptions_dev', true);
})
})(prod);