2017-09-05 11 views
0

Google Maps Geocoder APIを使用してアドレスのセットを緯度の高い値に変換する一連の関数を作成しようとしています。Google Maps Geocoder APIで約束する

現在のところ、アドレスをlong long値に変換することに成功しましたが、関数は返される前に完全に実行されます。私はこれが正しいことを知らせる前に、未定義のエラーがスローされるので、これを知っています。

私はJavaScriptの約束がこの種の問題の解決策になると聞きましたので、少し研究をしましたが、問題を助けてくれないようです。私は約束しています。

Here`s関連するコード

function getPoints(geocoder,map) { 
     let locationData = []; 
     let latValue; 
     for(let i = 0; i < addressData.length; i++){ 
      let getLatLong = new Promise(function(resolve,reject){ 
       latValue = findLatLang(addressData[i].location, geocoder, map); 
       if(latValue!=undefined){ 
         resolve(latValue()); 
       } else { 
         reject(); 
       } 
      }); 
      getLatLong.then(function(){ 
       console.log(latValue); 
       //returns a GMap latLng Object. 
       locationData.push(new google.maps.LatLng(latValue[0],latValue[1])); 
      }) 
     } 
     return locationData; 
    } 

function findLatLang(address, geocoder, mainMap) { 
     geocoder.geocode({'address': address}, function(results, status) { 
      if (status === 'OK') { 
       console.log(results); 
       return [results[0].geometry.location.lat , results[0].geometry.location.lng]; 
      } else { 
       alert('Couldnt\'t find the location ' + address); 
       return; 
      } 
     }) 
    } 

あなたが持っているであろう任意の助けやポインタを事前に感謝!

+0

getPointsのforループの内部には、getLatLongという約束があります。もう一度私はいくつかのビデオを見たので、私はこれを完全に間違って使用しているかもしれません。 –

+0

おっとそれを見ました。また、ループの中に約束があり、ループはあなたの 'then'を実行する前に繰り返されます。したがって、コードを少し変更する必要があります。私はサンプルを提供しましょう – Jaya

+0

あなたの約束事をすべて配列に入れておき、それを待っていますが、それを並列に処理したいのですか? – Jaya

答えて

2

あなたの主な問題は、geocoder.geocode()が非同期でコールバックをとることです。関数をコールバックに渡していますが、戻り値がメイン関数findLatLang()から返されるかのように扱いますが、そうではありません。現在findLatLang()は何も返しません。 getPoints()にループ内で次に

function findLatLang(address, geocoder, mainMap) { 
    return new Promise(function(resolve, reject) { 
     geocoder.geocode({'address': address}, function(results, status) { 
      if (status === 'OK') { 
       console.log(results); 
       resolve([results[0].geometry.location.lat , results[0].geometry.location.lng]); 
      } else { 
       reject(new Error('Couldnt\'t find the location ' + address)); 
      } 
    }) 
    }) 
} 

あなただけの配列にそれらの約束を収集することができますし、与えるアレイ上Promise.all()を呼び出す:あなたは約束を持っているし、関数からそれを返すべき場所

findLatLang()ですあなたの値は一度すべての約束は解決されている:addressDataがどこから来ている

function getPoints(geocoder,map) { 
    let locationData = []; 
    let latValue; 
    for(let i = 0; i < addressData.length; i++){ 
     locationData.push(findLatLang(addressData[i].location, geocoder, map)) 
    } 
    return locationData // array of promises 
} 

var locations = getPoints(geocoder,map) 

Promise.all(locations)  
.then(function(returnVals){ 
     // you should have return values here when 
     // all promises have rsolved 
      console.log(returnVals); 
}) 

をそれは明確ではない - あなたは関数内でそれを使用しているが、それはどこかに渡されていません。

+0

addressDataは、テスト用に使用しているグローバルなjsonデータです。私はそれがどのように動作するのか理解するために今質問を読んでいます。コメントありがとう:) –

+0

awesome!これはちょっとした調整でうまくいった! Promise.all関数は将来的には非常に便利なようです –