我是JS和Node.JS的新手,我正在做一个个人项目,使用Azure Translator API翻译webVTT字幕文件-为此,我使用Node-webVTT-npm包来解析/编译webVTT文件。解析操作提供了一个JSON对象,该对象包含数千个线索的数组,如下所示:
[
{
"identifier":"",
"start":60,
"end":61,
"text":"My text to be translated #1",
"styles":""
},
{
"identifier":"",
"start":110,
"end":111,
"text":"My text to be translated #2",
"styles":""
}
]
为了翻译";文本";属性,我使用微软在GitHub上提供的代码示例,并对translateText函数进行了以下更改:
- 我创建了一个承诺,返回一个";提示";对象(而不仅仅是翻译文本(
- 我拿了一个";提示";作为输入的对象和要翻译成的语言
然后我按照这里提供的代码,使用Promise.all和item.map的组合,通过我的异步translateText函数翻译所有提示文本
这是我的index.js的代码-它可以工作,但我真的不喜欢这个代码,我相信它可以优化,看起来更好。
require('dotenv').config();
const { readFileSync, writeFileSync } = require('fs');
const { parse, compile } = require('node-webvtt');
const { translateText } = require('./translate.js');
const inputStr = readFileSync('./subtitles.vtt', 'utf8');
const webVTT = parse(inputStr, { meta: true, strict : true });
const MSTranslateAsync = async (cue) => {
return translateText(cue, 'fr')
}
const mapAsync = async (vttCues) => {
return Promise.all(vttCues.map(cue => MSTranslateAsync(cue)))
}
mapAsync(webVTT.cues)
.then(() => {
outStr = compile(webVTT);
writeFileSync('./translated_fr.vtt', outStr, 'utf8');
});
例如,我正在寻找一种只使用Promises的方法,并获得您的建议来优化此代码
mapAsync(webVTT.cues)
.then(compile(webVTT))
.then((data) => writeFileSync('./translated_fr.vtt', data, 'utf8'));
// not required but I'm using async version of fs in my projects
const fsAsync = require('fs').promises;
//
const compileAndWrite = async ()=>{
await mapAsync(webVTT.cues);
let outStr = compile(webVTT); //let outStr = await compile(webVTT);
await fsAsync.writeFile('./translated_fr.vtt', outStr, 'utf8'); // ou use writeFileSync()
};
compileAndWrite();