2016-03-26 9 views
0

Bir yön bulmanın sonucunun bir noktasında yükseltmeyi içeren bir Google Maps API işlevselliği üzerinde çalışıyorum. Bu daha küçük yollar için iyidir, ancak daha fazla yolu olan daha büyük yollar sorun haline gelir. Bu yüzden, toplam yolu, yürütmek için ayrı gruplar halinde bölüştüm, ancak bazen rastgele bir sırayla geri dönüyorlar. Bu, Google Yükseklik Hizmetinin senkronize olmayan bir şekilde çağrılmasından kaynaklanır (ve başka bir yolu yoktur).window.setTimeout?

İstenen sonuç, tüm gruplar tamamlandığında (yalnızca bir grup olsa bile) yükseltme verilerinin çıktısıdır. Yani sırayla çağrıları işlemek için window.setTimeout dahil etmek düşündüm ama iki şey merak ediyorum:

  1. bu iyi bir yoldur mı veya daha iyi bir alternatif var mı?
  2. İşlevsellik sarılıyor ve sarılıyor ancak iyi bir şey olmadı. Belki birisi bana doğru yönde işaret edebilir? Aşağıda benim yalancı yaklaşımım.

    işlev getElevationData() { var elevator = new google.maps.ElevationService(); var batchSize = 250; var elevationBatches = Math.ceil (yol.routes [0] .overview_path/batchSize); (Var i = 0; i ++ < elevationBatches; i ++) { var thisBatch = [];

    for(var = j = i * batchSize; j < i * batchSize + batchSize; j++) { 
        if(j < directions.routes[0].overview_path.length) { 
        thisBatch.push(directions.routes[0].overview_path[j]); 
        } else { 
        break; 
        } 
    } 
    
    getElevationBatchData(elevator, i, batchData); 
    

    } }

    fonksiyonu getElevationBatchData (asansör, toplu, veri) { Window.setTimeout (function() {tamamlanmadan eğer ..? Denetleme fonksiyonunu tekrar görülen islenmeden ile // şey eğer değilse:

    elevator.getElevationAlongPath({ 
        path: data, 
        samples: 256 
    }, function(elevations, status) { 
        // process the result (basically checking for status OK, concatenating and adding rows to the DataTable 
    } 
    

    }, 100); }

şekilde kod işaretlemesi için yazık ki; SO'ların editöründe daha fazla sözde kod yazarken, artık doğru kod biçimlendirmesi uygulanmaz ...

cevap

1

Neden tüm istekleri paralel olarak çalıştırmıyorsunuz (yani setTimeout yaklaşımınızı kullanarak, ancak büyük olasılıkla gerekli değil) Burada) ve tüm bu istekler tamamlandığında ve kısmi sonucu döndürdüğünde genel sonuçları gösterir misiniz?

function onRequestComplete(index, context) { 
    alreadyProcessed++; 
    if (alreadyProcessed == totalNumOfRequests) { 
     showResults(); 
    } 
    batches[index].data = context; 
} 

function doAsyncRequest(index) { 
    someObject.doAsyncRequest(batches[index], function (err, data) { 
     onRequestComplete(index, data); 
    }); 
} 

for(var i=0;i<totalNumOfRequests;i++){ 
    doAsyncRequest(i); 
}; 
+0

Buradaki sadeliği seviyorum. Konsept görüyorum ve bunu hallediyorum. Bu, görebildiğim kadar iyi olacak. Teşekkürler! + 1A – Ben

İlgili konular