使用谷歌翻译json数据

最近有一个需求是使用node.js调用谷歌翻译,npm有一个叫google-translate-api的包,已经对谷歌翻译服务进行了封装,可以直接调用。npm包的安装及使用可以参考
链接: link.
链接: link.
api 提供了对字符串查询的基础功能,但是要实现对json对象的翻译,需要手动实现一下异步获取所有翻译结果的功能,在这里记录一下实现过程。
因为只能记录单个字符串,所以要把对象值的内容取出来,逐个翻译。平时async await用的比较多,所以首先想到的就是使用await异步获取到每个结果后放在原来的位置。

const translate = require('google-translate-api');

let data =   {
     
    "queryPerson": "露露",
    "enterprise": "不知名的神秘公司",
    "registration": "610100100442598",
    "type": "股份有限公司",
    "status": "在营(开业)",
    "registeredCapital": "23674.790100万人民币元",
    "isLegalPerson": 0,
    "isExecutive": 1,
    "isShareholder": 0,
    "position": "董事"
}
async function creatTranslate(){
     
    let start = new Date().getTime()
    for (let key in data){
     
      if(/[^\x00-\xff]/.test(data[key])){
     
        let res = await readyTranslate(data[key])
        if (res){
     
          data[key] = res.text
        }
      }
    }
    let end = new Date().getTime()
    let duration = end - start
    console.log(duration)
}
function readyTranslate(string){
     
    let res = translate(string, {
     to: 'en'})
    return res;
}
creatTranslate();

执行后得到结果如下

{
     
  queryPerson: 'Lulu',
  enterprise: "Unknown mysterious company",
  registration: '610100100442598',
  type: 'Co., Ltd.',
  status: 'In camp (opening)',
  registeredCapital: '23674.7901 million yuan',
  isLegalPerson: 0,
  isExecutive: 1,
  isShareholder: 0,
  position: 'director'
}

但是这种方式的不足之处在于,每次发出翻译都要等上次的结果返回了以后才能发出,耗时比较长。想要一种同时发出多个请求的方法,想到之前看到的promise对象有Promise.all()方法,接受一个数组为参数,将多个 Promise 实例,包装成一个新的 Promise 实例。

const translate = require('google-translate-api');

let data1 = {
     
    "queryPerson": "露露",
    "enterprise": "不知名的神秘公司",
    "registration": "610100100442598",
    "type": "股份有限公司",
    "status": "在营(开业)",
    "registeredCapital": "23674.790100万人民币元",
    "isLegalPerson": 0,
    "isExecutive": 1,
    "isShareholder": 0,
    "position": "董事"
}
 function translateZh(){
     
    let start = new Date().getTime()
    let keys = Object.keys(data1)
    const promises = keys.map(function (key) {
     
        return  translate(data1[key], {
     to: 'en'})
    });
    Promise.all(promises).then(function (posts) {
     
       console.log(posts)
      }).catch(function(reason){
     
        // ...
      });  
}
translateZh()

执行结果:

[
  {
     
    text: 'Lulu',
    from: {
      language: [Object], text: [Object] },
    raw: ''
  },
  {
     
    text: 'Unknown mysterious company',
    from: {
      language: [Object], text: [Object] },
    raw: ''
  },
  {
     
    text: '610100100442598',
    from: {
      language: [Object], text: [Object] },
    raw: ''
  },
  {
     
    text: 'Co., Ltd.',
    from: {
      language: [Object], text: [Object] },
    raw: ''
  },
  {
     
    text: 'In camp (opening)',
    from: {
      language: [Object], text: [Object] },
    raw: ''
  },
  {
     
    text: '23674.7901 million yuan',
    from: {
      language: [Object], text: [Object] },
    raw: ''
  },
  {
      text: '0', from: {
      language: [Object], text: [Object] }, raw: '' },
  {
      text: '1', from: {
      language: [Object], text: [Object] }, raw: '' },
  {
      text: '0', from: {
      language: [Object], text: [Object] }, raw: '' },
  {
     
    text: 'director',
    from: {
      language: [Object], text: [Object] },
    raw: ''
  }
]

返回了一个包含所有翻译结果的数组,麻烦点的就是需要对数据再进行一次处理,优点就是速度变快了。
一次小小的尝试,不足之处望大神指正。

你可能感兴趣的:(node.js,es6)