不确定这个问题是对还是错。让我描述一下问题以便更好地理解。考虑一个多级 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/