Javascript JS承诺:返回映射数据

Javascript JS承诺:返回映射数据,javascript,callback,promise,Javascript,Callback,Promise,我有一个函数“mapTranslations”,它从服务器获取数据,然后映射数据。目前,我使用回调返回数据。不过我不想使用承诺——我没有办法返回映射数据,而不是“somePromiseReturningFunction”中的数据。 函数映射翻译(回调){ somePromiseReturningFunction(…)。然后(function(languageData){ var-translations={}; languageData.d.results.forEach(函数(obj){ 翻

我有一个函数“mapTranslations”,它从服务器获取数据,然后映射数据。目前,我使用回调返回数据。不过我不想使用承诺——我没有办法返回映射数据,而不是“somePromiseReturningFunction”中的数据。

函数映射翻译(回调){
somePromiseReturningFunction(…)。然后(function(languageData){
var-translations={};
languageData.d.results.forEach(函数(obj){
翻译[obj.key]=obj[browserLang];
});
(翻译);
});
}
像这样使用它:

mapTranslations(函数(翻译){
console.log(翻译);
});
目标:

mapTranslations()。然后(函数(翻译){
log(translations)//例如,它不是匿名函数
});

我建议您返回原始承诺,并从
处理程序中返回一个值。然后()
这样的处理程序(下面有更多解释):

当您从
.then()处理程序返回值时,它将成为返回承诺的解析值,调用方将看到该值。因此,您可以修改从原始承诺返回的值,并在自己的
处理程序中返回它

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


仅供参考,您可能希望使用
.reduce()
而不是
.forEach()
,因为它与您正在做的事情更协调:

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

我建议您返回原始承诺,并从
处理程序中返回一个值。然后()
这样的处理程序(下面有更多解释):

当您从
.then()处理程序返回值时,它将成为返回承诺的解析值,调用方将看到该值。因此,您可以修改从原始承诺返回的值,并在自己的
处理程序中返回它

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


仅供参考,您可能希望使用
.reduce()
而不是
.forEach()
,因为它与您正在做的事情更协调:

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

这样做应该可以,
然后
可以返回一个值,并返回一个您可以使用的新承诺

function mapTranslations(){

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

}

mapTranslations().then( .... ).catch( ... );

这样做应该可以,
然后
可以返回一个值,并返回一个您可以使用的新承诺

function mapTranslations(){

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

}

mapTranslations().then( .... ).catch( ... );

是的,那正是我想要的。我不知道你现在可以这样还它。当然,在回访中包装承诺不是一条路——这就是我写这个问题的原因。:)@Sandrooco-我添加了一个新建议,用
.reduce()
而不是
.forEach()
。来缩短代码。看起来不错-为什么在第二次迭代中没有定义翻译?@Sandrooco-我在第二次迭代中缺少
return
语句。我修正了它。@Sandrooco-是的,
.reduce()
回调函数的任务是将传入的值作为第一个参数,修改它并返回给下一次迭代。上一次迭代返回的值是
.reduce()
调用返回的值。你可以看到描述。是的,这正是我要找的。我不知道你现在可以这样还它。当然,在回访中包装承诺不是一条路——这就是我写这个问题的原因。:)@Sandrooco-我添加了一个新建议,用
.reduce()
而不是
.forEach()
。来缩短代码。看起来不错-为什么在第二次迭代中没有定义翻译?@Sandrooco-我在第二次迭代中缺少
return
语句。我修正了它。@Sandrooco-是的,
.reduce()
回调函数的任务是将传入的值作为第一个参数,修改它并返回给下一次迭代。上一次迭代返回的值是
.reduce()
调用返回的值。你可以看到描述。