Подождите, пока Google переведет API, прежде чем писать на лист Excel

Я не могу понять, как заставить мой код ждать перевода Google, прежде чем пытаться писать на листе Excel. В консоли я вижу переведенные данные, но в документе Excel они все еще на исходном языке. Я знаю, что делаю все это неправильно, но я не могу понять это.

Это не показано в коде ниже, но вначале я читаю данные из файла .csv. Получите только те данные, которые мне нужны, и сохраните их в виде массива объектов для каждого случая. Затем я просматриваю этот массив и записываю каждый случай/объект в файл excel.

Существует реквизит под названием verbatim, который представляет собой текст, который я пытаюсь перевести на английский язык, прежде чем записывать его в файл excel. Но это не работает.

  cases.push({
    caseid: row['[CALLERNO_EMAIL_SOCIAL]'],
    caseorigine: row['[CASE_ORIGINE]'],
    emailaddress: row['[EMAIL]'],
    agent: row['[AGENT]'],
    region: row['[REGION2]'],
    csat: parseInt(row['Satisfaction note'], 10),
    fcr: fcr,
    phone: row['[PHONE]'],
    sentDate: row.date_envoi.slice(0, 10),
    receivedDate: row.date_reponse.slice(0, 10),
    verbatim: row['Verbatim experience'],
    tally1: row['[TALLY_1]'],
    tally2: row['[TALLY_2]'],
  });

const filter = {
  'Email entrant': 'emailentrant',
  'Email Sortant': 'emailsortant',
  'Appel Entrant': 'appelentrant',
  'Appel Sortant': 'appelsortant',
  Chat: 'chat',
};

function filterArray(array, filter) {
  return array.filter((item) => {
    if (filters.includes(filter[item.caseorigine])) {
      if (!filters.includes('includecsat5')) {
        if (parseInt(item.csat, 10) !== 5) return item;
      } else {
        return item;
      }
    }
  });
}
const filteredCases = await filterArray(cases, filter);

// translate verbatim value to english
async function translateTextWithModel() {
  filteredCases.forEach(async (item) => {
    const options = {
      to: target,
      model: model,
    };
    if (item.verbatim !== '') {
      let [verbatim] = await translate.translate(item.verbatim, options);
      console.info(verbatim);
      item.verbatim = verbatim;
    }
  });
}

await translateTextWithModel();

// write data to excel
filteredCases.forEach(async (item) => {
  worksheet.getRow(rowNum).getCell(1).value = item.caseid;
  worksheet.getRow(rowNum).getCell(2).value = item.caseorigine;
  worksheet.getRow(rowNum).getCell(3).value = item.emailaddress;
  worksheet.getRow(rowNum).getCell(4).value = item.agent;
  worksheet.getRow(rowNum).getCell(5).value = item.region;
  worksheet.getRow(rowNum).getCell(6).value = item.csat;
  worksheet.getRow(rowNum).getCell(7).value = item.fcr;
  worksheet.getRow(rowNum).getCell(8).value = item.phone;
  worksheet.getRow(rowNum).getCell(9).value = item.sentDate;
  worksheet.getRow(rowNum).getCell(10).value = item.receivedDate;
  worksheet.getRow(rowNum).getCell(11).value = item.verbatim;
  worksheet.getRow(rowNum).getCell(12).value = item.tally1;
  worksheet.getRow(rowNum).getCell(13).value = item.tally2;
  worksheet.getRow(rowNum).commit();
  rowNum += 1;
});

const outFile = `${destination}/${shortid.generate()}.xlsx`;

await workbook.xlsx.writeFile(outFile).then(async function () {
  const file = new File({
    title,
    description,
    file_path: outFile,
    file_mimetype: mimetype,
  });
  await file.save().then(res.send('file uploaded successfully.'));
});

Если вы можете подтвердить, что переведенный текст печатается (например, с помощью console.info(verbatim)), мне кажется, что переведенный текст теряется до того, как вы дойдете до инструкций Excel. Вам не кажется, что let в let [verbatim] вызывает исчезновение значений? насколько я знаю, областью действия let является непосредственный объемлющий блок {}, каков результат использования глобальной переменной с var или, по крайней мере, на том же уровне определения массива?

rsantiago 10.12.2020 01:25

это не имело никакого значения с var. В console.info функции перевода показано, что текст переводится правильно. Проблема в том, что часть Excel запускается до того, как функция успевает завершиться. Я добавил еще один console.info вне функции перевода, чтобы проверить дословно в массиве, и он печатает непереведенный текст, а затем функция печатает свой текст. Я не могу понять, как заставить код сначала запускать перевод.

Adrian Sultu 10.12.2020 09:45

Я заменил часть перевода простым кодом, чтобы заменить дословную часть на «тест», и это сработало. Так что проблема в том, что остальной код запускается первым и не ждет перевода.

Adrian Sultu 10.12.2020 10:12

я исправил это с помощью модуля под названием p-iteration. Хотя сейчас он работает нормально, я все же хотел бы знать, как я мог заставить его работать ванильным способом.

Adrian Sultu 10.12.2020 11:01

Я могу думать только о природе NodeJS, которая устраняет ожидание и просто продолжает следующий запрос, возможно, если операторы Excel включены в функцию, вы можете получить другие результаты, но не совсем уверен. Не могли бы вы опубликовать, как поведение было разрешено? детали могут помочь другим с такими же проблемами.

rsantiago 11.12.2020 22:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил это с помощью модуля под названием p-iteration

const { forEach } = require('p-iteration');


  await forEach(filteredCases, async (item) => {
          async function translateTextWithModel(text) {
            const options = {
              to: 'en',
              model: 'nmt',
            };
            if (text !== '') {
              var [verbatim] = await translate.translate(text, options);
              return verbatim;
            }
          }
          item.verbatim = await translateTextWithModel(item.verbatim);
          worksheet.getRow(rowNum).getCell(1).value = item.caseid;
          worksheet.getRow(rowNum).getCell(2).value = item.caseorigine;
          worksheet.getRow(rowNum).getCell(3).value = item.emailaddress;
          worksheet.getRow(rowNum).getCell(4).value = item.agent;
          worksheet.getRow(rowNum).getCell(5).value = item.region;
          worksheet.getRow(rowNum).getCell(6).value = item.csat;
          worksheet.getRow(rowNum).getCell(7).value = item.fcr;
          worksheet.getRow(rowNum).getCell(8).value = item.phone;
          worksheet.getRow(rowNum).getCell(9).value = item.sentDate;
          worksheet.getRow(rowNum).getCell(10).value = item.receivedDate;
          worksheet.getRow(rowNum).getCell(11).value = item.verbatim;
          worksheet.getRow(rowNum).getCell(12).value = item.tally1;
          worksheet.getRow(rowNum).getCell(13).value = item.tally2;
          worksheet.getRow(rowNum).commit();
          rowNum += 1;
        });

Другие вопросы по теме