不确定这个问题是对是错。让我描述一下这个问题,以便更好地理解。考虑一个具有随机英文文本字符串的键的多级json对象。任务是遍历该对象并访问每个节点,以创建另一个等效对象,该对象包含具有相同父对象的具有相同键(和级别)的英文字符串的翻译文本。使用递归,翻译是有效的,但从承诺中,它永远不会返回最终翻译的对象。但是没有错误。
对象:
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模块。谷歌翻译-api
发布于 2017-07-19 20:56:14
我认为你可以利用所有的承诺,完成工作,不是优化的代码,而是工作。
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))
将打印键和翻译的数组,希望这有帮助。
发布于 2017-07-20 07:47:37
我想了想一下。我会用一个非常不同的设计。它简单得多,不需要约定,应该只需要一个网络呼叫
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":{
"VERACITY": "Help me understand the best I can",
"VARIETY": "Silver surfer"
}
}
}
};
var vals = [];
shadow = JSON.parse(JSON.stringify( obj ));
function traverse(obj, shadow, vals, cb) {
if (typeof obj == 'object')
for (var i in obj)
if (typeof obj[i] == 'object')
traverse(obj[i], shadow[i], vals, cb);
else
cb(i, obj, shadow, vals);
else
return false;
}
//setup shadow and array of values
traverse(obj, shadow, vals, function(key, o, s, v) {
v.push(o[key]);
s[key] = v.length - 1;
});
function callService( cb ) {
console.log('... calling translation service... please wait..');
setTimeout( function() {
//call translation Service HERE use array vals if service accepts arrays
// or vals.join(DELIM); where DELIM is something you know the service won't touch
cb(vals.map( function(v) {return v + '-translated'}));
}, 1000);
}
callService( function(translatedArr) {
traverse(obj, shadow, vals, function(key, o, s, v) {
o[key] = translatedArr[s[key]];
});
console.log( obj );
});
如果你喜欢的话请告诉我。
https://stackoverflow.com/questions/45204395
复制