2016-03-27 11 views
-1

Google ElevationServiceのリクエストをバッチしようとしています(スタックオーバーフローに関する疑問が残っています)。私は今、全く新しいPromiseオブジェクトを指摘しています。forループの変数 "then"を約束します

私は4回、別のケースでは7回、もう1回は2回ループするとします。どのように私はそのループで約束を実装するだろうか?現時点では、250 LatLngで特定のGoogle Maps DirectionsResponseの時間内に高度データを取得しようとしています。

var currentBatch = 0; 
while(currentBatch < totalElevationBatches) { 
    getRouteElevationChartDataBatch(currentBatch, batchSize); 
    currentBatch++; 
} 

function getRouteElevationChartDataBatch(batch, batchSize) { 
    return new Promise(function(resolve, reject) { 
     var elevator = new google.maps.ElevationService(); 
     var thisBatchPath = []; 

     for (var j = batch * batchSize; j < batch * batchSize + batchSize; j++) { 
      if (j < directions.routes[0].overview_path.length) { 
       thisBatchPath.push(directions.routes[0].overview_path[j]); 
      } else { 
       break; 
      } 
     } 

     elevator.getElevationAlongPath({ 
      path: thisBatchPath, 
      samples: 256 
     }, function (elevations, status) { 
      if (status != google.maps.ElevationStatus.OK) { 
       reject(status); 
      } 

      routeElevations = routeElevations.concat(elevations); 
     }); 
    }); 
} 

しかし、彼らは.then()方法で連鎖されていないため、これらの呼び出しは、まだ非同期で実行されています。チェーンの可変数をどのようにチェーンでき、いつ終了するのか知ることができますか?申し訳ありませんが、これは完全なばかげた質問です。しかし、私は

+0

あなたは何の '.thenを使用していませんあなたは解決しない(拒否のみ)...これは近くにない救済可能なコード –

+0

したがって、「私は完全に新しい」... – Ben

+0

私は最近、ES6の新しい部分(約束を含む)を話しました。スピーカーは新しいイテレーターと共に約束を使用しました。それを完全にフォローしなかったかもしれませんが、おそらくこれが役に立ちます:http://www.2ality.com/2015/02/es6-iteration.html –

答えて

1

をドキュメント(herehere)を相談した後、それを得ることはありません、私はタイムアウトを使用して考えていない効率的なソリューションを与えるだろう、それを行うための簡単な方法は、「を」に、それぞれの約束の呼び出しを追加することですのシングル約束チェーン、例:

let promise = Promise.resolve(), // initialize promise chain 
    someArray = [ ... ]; 

for(let i=0;i<someArray.length;i++) 
    promise = promise.then(() => someCall(someArray[i])) 

ので、あなたのコードは、以下のように変更することができます(Jaromanda Xが言ったように私は最終的に解決呼び出しを追加している)

var currentBatch = 0, promise = Promise.resolve(); 
while(currentBatch < totalElevationBatches) { 
    promise = addToChain(promise, currentBatch, batchSize); 
    currentBatch++; 
} 

promise.then(...) // write code inside then that would handle once all the batches are processed 

function getRouteElevationChartDataBatch(batch, batchSize) { 
    return new Promise(function(resolve, reject) { 
     var elevator = new google.maps.ElevationService(); 
     var thisBatchPath = []; 

     for (var j = batch * batchSize; j < batch * batchSize + batchSize; j++) { 
      if (j < directions.routes[0].overview_path.length) { 
       thisBatchPath.push(directions.routes[0].overview_path[j]); 
      } else { 
       break; 
      } 
     } 

     elevator.getElevationAlongPath({ 
      path: thisBatchPath, 
      samples: 256 
     }, function (elevations, status) { 
      if (status != google.maps.ElevationStatus.OK) { 
       reject(status); 
      } 

      routeElevations = routeElevations.concat(elevations); 
      resolve(); 
     }); 
    }); 
} 

function addToChain(chain, batch, batchSize){ 
    return chain.then(function(){ 
     return getRouteElevationChartDataBatch(batch, batchSize); 
    }); 
} 
+0

答えを書く時間をとってくれてありがとうございました。私のコードにカスタマイズすることもできます。これは、 'let promise ... 'という構文はまだ私を混乱させるが、意味をなさない。 +10と受け入れ、私は+1を与えることができます;) – Ben

関連する問題