非同期コールバック関数から値を返すにはどうすればいいですか? [重複] 質問する

非同期コールバック関数から値を返すにはどうすればいいですか? [重複] 質問する

この質問は SO で何度も尋ねられます。しかし、まだ何も得られません。

コールバックから何らかの値を取得したいです。説明については以下のスクリプトをご覧ください。

function foo(address){

      // google map stuff
      geocoder.geocode( { 'address': address}, function(results, status) {
          results[0].geometry.location; // I want to return this value
      })

    }
    foo(); //result should be results[0].geometry.location; value

その値を返そうとすると、単に「未定義」になります。SO のアイデアをいくつか実行しましたが、それでも失敗します。

それらは:

function foo(address){
    var returnvalue;    
    geocoder.geocode( { 'address': address}, function(results, status) {
        returnvalue = results[0].geometry.location; 
    })
    return returnvalue; 
}
foo(); //still undefined

ベストアンサー1

同期メソッド内で非同期呼び出しから戻ることができないため、これは不可能です。

この場合、戻り値を受け取るコールバックをfooに渡す必要があります。

function foo(address, fn){
  geocoder.geocode( { 'address': address}, function(results, status) {
     fn(results[0].geometry.location); 
  });
}

foo("address", function(location){
  alert(location); // this is where you get the return value
});

つまり、内部関数呼び出しが非同期の場合、応答を「返す」ためには、この呼び出しを「ラップする」すべての関数も非同期である必要があります。

コールバックがたくさんある場合は、思い切ってQのようなpromiseライブラリ

おすすめ記事