个人的承诺需要与Promise.all()
进行汇总,并从根本上,这是少了什么东西。
但是,您可以通过减少对Google服务的呼叫数量来做得更好。
谷歌翻译API允许通过传递一组单词而不是一个单词来翻译多个文本字符串,从而为您提供性能优势,虽然可能没有价格优势 - 谷歌目前对其翻译服务收费“每个字符“,而不是”每个电话“。
我找不到任何文档google.translate()
,但是,有几个假设,你可以写:
function translateByCategory(obj, sourceCode, targetCode) {
let translatedObj = {};
var promises = Object.keys(obj).map(function(key) {
return google.translate(obj[key], sourceCode, targetCode).then(function(translations) {
translatedObj[key] = translations.map(function(t) {
return t.translatedText || '-';
});
}, function(error) {
translatedObj[key] = [];
});
});
return Promise.all(promises).then(function() {
return translatedObj;
});
}
如果还是不行,那么this documentation解释如何调用谷歌的REST翻译直接服务。
你应该能够编写:
function translateTexts(baseParams, arrayOfStrings) {
let queryString = baseParams.concat(arrayOfStrings.map(function(str) {
return 'q=' + encodeURIComponent(str);
})).join('&');
return http.ajax({ // some arbitrary HTTP lib that GETs by default.
url: 'https://translation.googleapis.com/language/translate/v2?' + queryString,
}).then(function(response) {
return response.data.translations.map(function(t) {
return t.translatedText || '-';
});
}, function(error) {
translatedObj[key] = []; // on error, default to empty array
});
}
function translateByCategory(obj, sourceCode, targetCode) {
let baseParams = [
'key=' + MY_API_KEY, // from some outer scope
'source=' + sourceCode, // eg 'en'
'target=' + targetCode // eg 'es'
];
let translatedObj = {};
let promises = Object.keys(obj).map(function(key) {
return translateTexts(baseParams, obj[key]).then(function(translations) {
translatedObj[key] = translations;
}, function(error) {
translatedObj[key] = []; // on error, default to empty array
});
});
return Promise.all(promises).then(function() {
return translatedObj;
});
}
在任何情况下,请拨打如下:
let setOfWords = {
"nouns": [
"work",
"construction",
"industry"
],
"verbs": [
"work"
],
};
translateByCategory(setOfWords, 'en', 'es').then(function(setOfTranslatedWords) {
console.log(setOfTranslatedWords);
});
创建一个promise数组并使用'Promise.all'(两次,即每个循环)。不要使用新的Promise。 – Bergi
@Bergi可以请你发表一个代码示例吗?我仍然无法理解'Promise.all()' – Gus
顺便说一句,你确定要'推'字'而不是'翻译'吗? – Bergi