2017-01-31 6 views
0

私はサーバからデータを取得してマッピングする関数 "mapTranslations"を持っています。現時点では、コールバックを使用してデータを返します。私は約束を使用することを望んでいません - マップされたデータを返す方法と、somePromiseReturningFunctionからデータを返す方法に関するアプローチはありません。私はあなたがオリジナルの約束を返す示唆し、このようなあなたの.then()ハンドラ(複数から値を返すだろうJS Promise:マップされたデータを返す

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

答えて

1

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; 
     }, {}); 
    }); 
} 
+0

これは私が探していたものです。私は今、あなたはこれのようにそれを返すことはできませんでした。もちろんコールバックで約束を守ることは道ではありません - それが私がこの質問を書いた理由です。 :) – sandrooco

+0

@Sandrooco - '.forEach()'ではなく '.reduce()'でコードを短縮する新しい提案を追加しました。 – jfriend00

+0

2番目の反復で翻訳が定義されていないのはなぜですか? – sandrooco

1

何かが行う必要があり、thenが値を返すことができます


FYI、あなたはそれが何をやっているとのより良い少し揃えるよう.reduce()の代わり.forEach()を使用する場合がありますあなたが使うことができる新しい約束を返します。

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(...); 
関連する問題