javascript - JS promise : Return mapped data

标签 javascript callback promise

我有一个函数“mapTranslations”,它从服务器获取数据然后映射它。目前我使用回调来返回数据。但我不想使用 promise - 我没有办法返回映射数据而不是来自“somePromiseReturningFunction”的数据。

function mapTranslations(callback){
    somePromiseReturningFunction(...).then(function (languageData) {
        var translations = {};
        languageData.d.results.forEach(function (obj) {
            translations[obj.key] = obj[browserLang];
        });
        callback(translations);
    });
}

像这样使用它:

mapTranslations(function(translations){
    console.log(translations);
});

目标:

mapTranslations().then(function(translations){
    console.log(translations) //Example, wouldn't be an anonymous function
});

最佳答案

我建议您返回原始 Promise 并从 .then() 处理程序返回一个值,如下所示(更多说明如下):

function mapTranslations(){
    return somePromiseReturningFunction(...).then(function (languageData) {
        var translations = {};
        languageData.d.results.forEach(function (obj) {
            translations[obj.key] = obj[browserLang];
        });
        return translations;
    });
}

// usage
mapTranslations().then(function(results) {
     // access results here
}).catch(function(err) {
     // handle error here
});

当您从 .then() 处理程序返回一个值时,该值将成为返回的 Promise 的解析值,并且调用者将看到该值。因此,您可以修改原始 Promise 的返回值,并将其返回到您自己的 .then() 处理程序中。

此外,您真的不想将 promise 包装在回调中。这只会抛弃 Promise 的所有优点(链接能力、自动异步错误传播、管理/协调多个异步操作的能力、与其他异步操作的互操作性等)。相反,只需返回 Promise 并让调用者在返回的 Promise 上使用 .then() 即可访问数据或错误。仅供引用,在您建议的回调代码中,您正在悄悄地吃掉来自 somePromiseReturningFunction() 的任何错误。如果它拒绝了返回的 promise ,那么您就没有处理程序,因此调用者永远不会知道。如果您只是从函数中返回 promise ,则错误处理是免费的。

<小时/>

仅供引用,您可能需要使用 .reduce() 而不是 .forEach(),因为它更符合您正在做的事情:

function mapTranslations(){
    return somePromiseReturningFunction(...).then(function (languageData) {
        return languageData.d.results.reduce(function(translations, obj) {
            translations[obj.key] = obj[browserLang];
            return translations;
        }, {});
    });
}

关于javascript - JS promise : Return mapped data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41951740/

相关文章:

javascript - 访问父组件变量

javascript - 如何在 Firefox 中允许来自 greasemonkey 脚本的跨源请求?

callback - Vue.js 2 和 auth0 身份验证结果为 'nonce'

javascript - Puppeteer 更改输入值

javascript - 从node.js中的回调函数获取result.insertId

boost - 延迟后未调用 async_write_some 回调

typescript - ionic 存储在 promise 中未定义?

javascript - 从调用到获取的类型 Promise 是通用的吗?

javascript - JavaScript Promise 中的可选 catch

javascript - 使用 Javascript 的两个 HTML 页面链接