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