この質問は 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ライブラリ。