1. ホーム
  2. javascript

[解決済み] 非同期コールバック関数から値を返すには?重複

2022-03-18 08:39:45

質問

この質問は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

その値を返そうとすると、"undefined"が返ってくるだけです。SOからいくつかのアイデアを追いましたが はまだ失敗しています。

それらは

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

解決方法は?

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

この場合、戻り値を受け取るコールバックを 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のようなプロミスライブラリ .