我正在尝试将一个很大的提升请求拆分为多个请求,以避免每个请求中的1sec / request和512 coords限制。
我面临的问题是我的请求的回复并不总是按顺序收到。使用setInterval足够可靠吗? 以下是以错误顺序收到的导致问题的响应示例(在使用setInterval之前): https://www.dropbox.com/s/x00jdnprj6w7lga/correctMap.png?dl=0
这是我最新的代码:
function getCourseElevationData() {
var path = bikePathCoordinates; //Bunch of lat,long coords
// numberRequestToDo = Math.ceil(path.length/512); //TODO: split request in multiple 512 pack (google quotas)
numberRequestToDo = 2; //Temporary for testing
currentRequestNumber = -1; //will be at 0 on first call to get512Elevation
arrayOfRequest = [];
//1
var ptrStart= 0;
var pathSliced = path.slice(ptrStart, ptrStart+512);
arrayOfRequest.push(pathSliced);
//2
ptrStart += 512;
pathSliced = path.slice(ptrStart, ptrStart+512);
arrayOfRequest.push(pathSliced);
timerElevation = setInterval(request512Elevation, 1000); //1sec
}
//---------------------------------------------------------
function request512Elevation() {
alert("request512Elevation");
// Still has request to be done
if (currentRequestNumber+1 < numberRequestToDo) {
if (!lastRequestElevationFailed) {
currentRequestNumber++;
}
get512Elevation(arrayOfRequest[currentRequestNumber], currentRequestNumber);
}
// All request completed!
else {
clearInterval(timerElevation);
}
}
//------------------------------------------------------------------------------------------------
function get512Elevation(pathSliced, requestNumber) {
alert("get512PointsElevation" + requestNumber);
var locationElevationRequest = {
'locations': pathSliced
}
elevator.getElevationForLocations(locationElevationRequest, function (results, status) {
alert("ResponseReceived for request:" + requestNumber + ", status" + status + " result length:" + results.length);
if (status != google.maps.ElevationStatus.OK) {
lastRequestElevationFailed = true;
return;
}
lastRequestElevationFailed = false;
var elevations = results;
// Extract the elevation samples from the returned results
for (var i = 0; i < results.length; i++) {
elevationPath.push(elevations[i].location);
}
for (var i = 0; i < results.length; i++) {
dataElevation.addRow(['', elevations[i].elevation]);
}
//last reply received? if yes, we can display the elevation graph
if (currentRequestNumber+1 == numberRequestToDo) {
chart.draw(dataElevation, chartOptions);
}
//TODO: how to make sure response are received in correct order (1,2,3)? setInterval reliable enough?
});
}