2017-05-22 17 views
0

inside forループが真であるたびにルートを取得したい。Forループ内部での非同期約束

それは予想通りif HIT ${j}を示し、その後getSinglePart(partPath)火災、予想通りlog 1示し、それは右log 1getSinglePart(partPath).then(res)resを返す必要があります。

しかし、getSinglePart().then((res))は、forループの終了後すぐにすべてのルートを表示します。

なぜそれは約束を返すのですか?それを修正する方法は?事前に

感謝:)

function getSinglePart(partPath){ 
return new Promise((resolve, reject) => { 
    console.log('log 1'); 
    let tempDirectionsService = new google.maps.DirectionsService; 
    let tempElevationService = new google.maps.ElevationService; 
    let tempDirectionsRenderer = new google.maps.DirectionsRenderer({draggable: true, map: store.getState().map}); 
    tempDirectionsService.route({ 
     origin: partPath[0], 
     //waypoints: waypointsArray, 
     destination: partPath[partPath.length-1], 
     travelMode: 'WALKING', 
     avoidTolls: true 
    }, (res, status) => { 
     resolve(res); 
    }); 
});} 

function getParts(response){ 
let distances = []; 
let legs = response.routes[0].legs; 

for(let i=0; i<legs.length; i++){ 
    let steps = legs[i].steps; 
    let distanceCounter = 0; 
    let partsCounter = 0; 
    let startNextIndexes = [0]; 

    for(let j=0; j<steps.length; j++){ 
     distances.push(steps[j].distance.value); 
     distanceCounter += steps[j].distance.value; 

     if(distanceCounter > 100000 || j === steps.length-1){ 
      startNextIndexes.push(j+1); 
      let partPath = []; 
      distanceCounter = 0; 

      console.log(`if HIT ${j}`); 
      for(let k=startNextIndexes[partsCounter]; k<=j; k++){ 
       for(let l=0; l<steps[k].path.length; l++){ 
        partPath.push(steps[k].path[l]); 
       } 
      } 

      getSinglePart(partPath).then((res) => { 
       console.log('then'); 
       console.log(res); 
      }); 
     } 
    } 
}} 
+0

ループは約束を待ちませんか? – Bergi

+0

@Bergiいいえ、それは自分の人生を生きています:D私は以下のコメントからリンクを読むようにしようとします;) – gdziemojkomp

+0

あなたが達成しようとしているものについて詳しく述べることもできます。おそらく、実際には各反復が完了するのを待つ必要はなく、単にループの外側で処理を行うこともできます。 – Maksym

答えて

0

説明behaivorが、あなたは、本質的にあなたのループを終了し、その後、非同期で処理されるべき「tempDirectionsService.route」機能の束をスケジュールしているので、正しいと思われ、 'tempDirectionsService.route'が完了するのを待ちます(それぞれの 'tempDirectionsService.route'が特定の順番で完了したときにループ中に印刷されるか、後になる可能性があります)。ループの次の繰り返しに進む前に、現在スケジュールされている 'tempDirectionsService.route'が完了するまで待つことを目標とする場合は、それに応じてループを書き直す必要があります。たとえば:

JavaScript ES6 promise for loop

Correct way to write loops for promise.

関連する問題