javascript - 如何在循环并进行异步 promise 调用后获取重新格式化的 json 对象

标签 javascript json node.js promise google-translate

不确定这个问题是对还是错。让我描述一下问题以便更好地理解。考虑一个多级 json 对象,其键具有随机英文文本字符串作为它们的值。任务是迭代对象并访问每个 Node 以创建另一个等效对象,其中包含那些具有与以前相同的键(和级别)和相同父对象的英语字符串的翻译文本。使用递归翻译是有效的,但是在 promise 中它永远不会返回最终翻译的对象。但是没有错误。

对象:

var obj =   {
  "MENU": {
    "NODE": "Wait for her",
    "RESPONSE": {
      "ATTR": "We'll meet again",
      "SEMANTICS": "The Dark Knighthood"
    }
  },
  "NODES": {
    "STANDARDLIBRARY": {
      "SERVER": "Never say never again",
      "CATEGORIES":{
        "INFOPROTECTION":"Infoprotection",
        "DATAMOTION":"Data In Motion",
        "LOGGING":"Loggin is key to debugging",
        "VERACITY": "Help me understand the best I can",
        "VARIETY": "Silver surfer"
      }
    }
  }
};

代码:

const iterateAttributesAndParseJSON = (o) => {
  return new Promise(
   function (resolve, reject) {
      for(var a in o) {
        if (typeof o[a] == 'object'){
          iterateAttributesAndParseJSON(o[a])
        }else{
          if( o[a] != '' ) {
            translate(o[a], {from: 'en', to: 'nl'}).then( res => {
                //return jsonObj[a]=res.text;
                jsonObj[a]=res.text;
                //console.log(jsonObj);
                resolve(jsonObj);
            }).catch(err => {
              console.error(err)
                reject(err);
            });
          }
        }
      }
     }
   );
}

iterateAttributesAndParseJSON(obj).then(asd => { console.log(`Resolved:`,  asd) }, err => console.log(err))

注意:翻译再次可用。我使用了这个 npm 模块。 google-translate-api

最佳答案

我认为您可以使用 promise all 来完成工作,不是优化代码而是工作。

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

    //var jsonObj = {};

    var obj = {
        "MENU": {
            "NODE": "Wait for her",
            "RESPONSE": {
                "ATTR": "We'll meet again",
                "SEMANTICS": "The Dark Knighthood"
            }
        },
        "NODES": {
            "STANDARDLIBRARY": {
                "SERVER": "Never say never again",
                "CATEGORIES": {
                    "INFOPROTECTION": "Infoprotection",
                    "DATAMOTION": "Data In Motion",
                    "LOGGING": "Loggin is key to debugging",
                    "VERACITY": "Help me understand the best I can",
                    "VARIETY": "Silver surfer"
                }
            }
        }
    };

    var promises = [];

    const iterateAttributesAndParseJSON = (o) => {
        for (var a in o) {
            if (typeof o[a] == 'object') {
                iterateAttributesAndParseJSON(o[a]);
            } else {
                if (o[a] != '') {
                    var promise = translate(o[a], { from: 'en', to: 'nl' }).then(res => {
                        var jsonObj = {};
                        jsonObj[a] = res.text;
                        return jsonObj;
                    }).catch(err => {
                        console.error(err)
                        // reject(err);
                    });
                    promises.push(promise);
                }
            }
        }
    }

    iterateAttributesAndParseJSON(obj);
    console.log(promises.length);

    Promise.all(promises).then(asd => { console.log(`Resolved:`, asd) }, err => console.log(err))

将打印键和翻译的数组,希望这有帮助

关于javascript - 如何在循环并进行异步 promise 调用后获取重新格式化的 json 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45204395/

相关文章:

javascript - 如何在 Node.js 中跳过 "async.forEachOf"循环迭代

javascript - 双字节整数转单字节-Javascript

javascript - 在分区中切换图像。使用 javascript 背景图像 : url(id ="demo");

javascript - 脚本适用于 jsfiddle 但不适用于我的网页 jquery

django - 如何使用 Django REST 框架制作 POST 简单的 JSON? CSRF token 丢失或不正确

css - getorgchart源数据格式化

javascript - 为什么不让所有函数都异步 JS

javascript - 为什么 jQuery 对象有一个属性,但 hasOwnProperty 说它没有?

java - Groovy/Java - JSON - 通过可变路径更新 JSON

node.js - Mongoose - 如何用每条记录一个值更新许多特定记录?