Estoy usando la API de traducción de Google para traducir datos de un archivo json a una configuración regional francesa y luego volver a escribirlos en un archivo. Estoy usando una función recursiva para iterar sobre el archivo json ya que está profundamente anidado. Sin embargo, la ejecución no espera hasta que se complete la traducción antes de escribir en el archivo. Intenté usar enfoques de devolución de llamada y promesa, pero no pude hacerlo bien.
Solo para que funcione, ya que requería una salida como una emergencia, configuré un tiempo de espera antes de que se llame al método de escritura. Funciona, pero me gustaría aprender el enfoque apropiado/correcto para implementar esto.
const fs = require('fs') const {Translate} = require('@google-cloud/translate').v2 require('dotenv').config() process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0 const credentials = JSON.parse(process.env.credentials) const translate = new Translate({ credentials, projectId: credentials.project_id, }) let data = {} // writeJSONTofile should be executed only after readJSONFile execution is completed //read file const readJSONFile = () => { try { data = JSON.parse(fs.readFileSync('...\\locale\\en.json')) iterateAndTranslate(data) setTimeout(() => { writeJSONToFile() }, 25000) } catch (error) { console.log(error) } } // iterate, translate, reassign const iterateAndTranslate = async (data) => { for(key in data) { if (typeof data[key] === 'object' && data[key] !== null) { iterateAndTranslate(data[key]) } else{ data[key] = await translateText(data[key], 'fr') } } } //translate method const translateText = async (text, targetLanguage) => { try { let [response] = await translate.translate(text, targetLanguage) return response } catch (error) { console.log(error) return 0 } } const writeJSONToFile = async () => { var outputFileName = 'C:\\test\\test.json' await fs.writeFileSync(outputFileName, JSON.stringify(data,null,4), (err) => { if(err) { console.log(err) } else { console.log('Done!') } }) } // start from here readJSONFile()Tienes algunos problemas con tu código.
global variable y la mutan en lugar de obtener una entrada y devolver una salida.varasync-await await redundante en la función writeJSONToFileVea mi punto de vista sobre la posible solución.
const fs = require("fs"); const { Translate } = require("@google-cloud/translate").v2; require("dotenv").config(); process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; const credentials = JSON.parse(process.env.credentials); const translate = new Translate({ credentials, projectId: credentials.project_id, }); // writeJSONTofile should be executed only after readJSONFile execution is completed //read file const readJSONFile = async () => { try { const data = JSON.parse(fs.readFileSync("...\\locale\\en.json")); return iterateAndTranslate(data); } catch (error) { console.log(error); } return {}; }; // iterate, translate, reassign const iterateAndTranslate = async (data) => { for (let key in data) { if (typeof data[key] === "object" && data[key] !== null) { await iterateAndTranslate(data[key]); } else { data[key] = await translateText(data[key], "fr"); } } return data; }; //translate method const translateText = async (text, targetLanguage) => { try { let [response] = await translate.translate(text, targetLanguage); return response; } catch (error) { console.log(error); } return null; }; const writeJSONToFile = (data) => { let outputFileName = "C:\\test\\test.json"; fs.writeFileSync(outputFileName, JSON.stringify(data, null, 4), (err) => { if (err) { console.log(err); } else { console.log("Done!"); } }); }; // start from here const run = async () => { const data = await readJSONFile(); writeJSONToFile(data); }; run();Ver más: