2017-08-29 20 views
0

レストランチェーン名をキーとし、緯度と経度からなるオブジェクトを値として持つJavascriptディクショナリを作成したいと考えています。私は、次のコードを持っている:Google Maps APIを使用したJavascriptの非同期関数

// create symbol table of name-coordinate pairs 
var baseLocation = new google.maps.LatLng(window.latBase, window.lngBase); 
var dict = {}; 
var service = new google.maps.places.PlacesService(window.map); 

for (var i = 0; i < arr.length; i++) { 
    var singleChain = arr[i]; 
    console.log(singleChain); 
    var request = { 
     location: baseLocation, 
     radius: '5000', 
     query: singleChain 
    }; 

    service.textSearch(request, function(results, status) { 
     if (status == google.maps.places.PlacesServiceStatus.OK) { 
      dict[singleChain] = { 
       lat: results[0].geometry.location.lat(), 
       lng: results[0].geometry.location.lng() 
      } 
     } 
    }) 

    // end for loop 
} 

問題は、私は今、GoogleのAPIリクエストが非同期ではないことを認識し、その各要求は、実際に終わる、ARR []内の唯一の最後の鎖の上に作られている、あります単一エントリ辞書。望ましい機能を得るために非同期関数を実装する最善の方法は何ですか?

答えて

0

非同期関数を持つforループを使用する代わりに、別のアプローチをとることができます。再帰関数を使用することができます。例えば

let arr = [1, 2, 3 , 4, 5]; 
 

 
function doSometing(i) { 
 
    if(i >= arr.length) { 
 
    return false; 
 
    } 
 

 
    setTimeout(function() { 
 
    /* Do your computations */ 
 
    console.log(arr[i]); 
 
    doSometing(i + 1); 
 
    }, 2000); 
 
} 
 

 
doSometing(0);

+0

あなたのソリューションが原因再帰によるタイムアウト、ないの作品のように思えます。私は同じ効果に投稿したコードにタイムアウトを追加できませんでしたか? @ Shubham – samuelli97

+0

私は再帰関数に変更し、今は私が望むように動作します。 – samuelli97

+0

@ samuelli97出力が非同期であることを示すために 'setTimeout'を入力します。あなたの場合、 'for'ループは結果が来るのを待っていません。 – Shubham

関連する問題