gpt4 book ai didi

javascript - JS promise : Return mapped data

转载 作者:行者123 更新时间:2023-12-01 04:04:18 24 4
gpt4 key购买 nike

我有一个函数“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com