Не удается запустить вложенные функции asyn c внутри .map () перед блоком .then () - PullRequest
0 голосов
/ 08 мая 2020

Я создаю скрипт для создания отчета по подпискам. Следующее объясняет процесс:

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);

1 Ответ

1 голос
/ 08 мая 2020

Попробуйте следующее:

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(async 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) {
      await (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);

изменил две строки:

await Promise.all(subscriptions.map(async sub => {


await (async (env) => {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...