:
mapTranslations(function(translations){
console.log(translations);
});
目標:このようにそれを使用して
function mapTranslations(callback){
somePromiseReturningFunction(...).then(function (languageData) {
var translations = {};
languageData.d.results.forEach(function (obj) {
translations[obj.key] = obj[browserLang];
});
callback(translations);
});
}
以下の説明):
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()
ハンドラから返された約束の解決された値となる値を返すと、呼び出し元にその値が表示されます。したがって、元の約束から返された値を変更し、独自の.then()
ハンドラで返すことができます。
さらに、コールバックで約束を守ることは本当にありません。それは、約束(連鎖する能力、自動非同期エラー伝播、複数の非同期操作を管理/調整する能力、他の非同期操作との相互運用性など)のすべての利点を放棄するだけです。代わりに、約束を返し、呼び出し元が返された約束に.then()
を使用させて、データやエラーにアクセスできるようにしてください。参考までに、提案されたコールバックコードで、あなたは何も間違いを黙って食べていましたsomePromiseReturningFunction()
。それが返すという約束を拒否した場合は、ハンドラがないので、呼び出し元は決して知りません。あなたの関数から約束を返すだけなら、そのエラー処理は無料で行えます。このような
function mapTranslations(){
return somePromiseReturningFunction(...).then(function (languageData) {
return languageData.d.results.reduce(function(translations, obj) {
translations[obj.key] = obj[browserLang];
return translations;
}, {});
});
}
これは私が探していたものです。私は今、あなたはこれのようにそれを返すことはできませんでした。もちろんコールバックで約束を守ることは道ではありません - それが私がこの質問を書いた理由です。 :) – sandrooco
@Sandrooco - '.forEach()'ではなく '.reduce()'でコードを短縮する新しい提案を追加しました。 – jfriend00
2番目の反復で翻訳が定義されていないのはなぜですか? – sandrooco