首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript承诺:迭代所有对象键数组,然后解析

Javascript承诺:迭代所有对象键数组,然后解析
EN

Stack Overflow用户
提问于 2016-11-22 09:49:49
回答 3查看 14.3K关注 0票数 7

我有这个JS对象:

代码语言:javascript
运行
复制
let setOfWords = {
    "nouns": [
        "work",
        "construction",
        "industry"
    ],
    "verbs": [
        "work"
    ],
}

我使用的是google translate API,它调用了一个REST资源,所以我需要等待每个翻译的响应,然后使用翻译后的单词解析相同的对象结构。

代码语言:javascript
运行
复制
function translateByCategory(){
    let translatedObj = {};
    return new Promise(function(resolve, reject){

        Object.keys(obj).forEach(function(category){
            if (translatedObj[category] == undefined) {
                translatedObj[category] = [];
            }
            setOfWords.forEach(function(word){
                google.translate(word, 'es', 'en').then(function(translation){
                    translatedObj[category].push(translation.translatedText);
                });
            });

            // return the translatedObj until all of the categories are translated
            resolve(translatedObj);
        });
    });
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-22 10:09:37

您可以使用Promise.all()等待所有promise的实现(或首次拒绝)

代码语言:javascript
运行
复制
var translateRequests = [];

Object.keys(setOfWords).forEach(function(category){
        setOfWords[category].forEach(function(word){
            translateRequests.push(google.translate(word, 'es', 'en'));
        });
    });
});

Promise.all(translateRequests).then(function(translateResults){
    //do something with all the results
});

请参阅此处的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

票数 8
EN

Stack Overflow用户

发布于 2016-11-23 03:17:23

单个promises需要与Promise.all()聚合,从根本上说,这是缺少的。

但是,通过减少对Google服务的调用次数,您可以做得更好。

Google translate API允许通过传递一个单词数组来一次翻译多个文本字符串,而不是每个调用一个单词,这为您提供了性能优势,但可能不是价格优势- google目前对其翻译服务收费的是“按字符”,而不是“按调用”。

我找不到任何关于google.translate()的文档,但是,在一些假设的情况下,您也许能够这样写:

代码语言:javascript
运行
复制
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会解释如何直接调用谷歌的RESTful翻译服务。

您应该能够编写以下代码:

代码语言:javascript
运行
复制
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;
    });
}

无论哪种情况,都可以按如下方式调用:

代码语言:javascript
运行
复制
let setOfWords = {
    "nouns": [
        "work",
        "construction",
        "industry"
    ],
    "verbs": [
        "work"
    ],
};

translateByCategory(setOfWords, 'en', 'es').then(function(setOfTranslatedWords) {
    console.log(setOfTranslatedWords);
});
票数 1
EN

Stack Overflow用户

发布于 2017-07-12 18:30:04

可以对@hackerrdave建议的方法进行修改,使其与JavaScript的异步等待功能更兼容,如下所示:

代码语言:javascript
运行
复制
function translateByCategory(){

    return new Promise(function(resolve, reject){
        var translateRequests = [];
        Object.keys(setOfWords).forEach(function(category){
                setOfWords[category].forEach(function(word){
                    translateRequests.push(google.translate(word, 'es', 'en'));
            });
        });
        Promise.all(translateRequests).resolve(resolve(translateRequests));
    });
}

所以现在你可以这样做了:

代码语言:javascript
运行
复制
let translatedObj = await translateByCategory();

你会在"translatedObj“中得到你想要的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40732541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档