我正在使用Google Maps API功能,该功能包含在路线结果的某个点获取高程。这适用于较小的路线,但路径较多的较大路线成为问题。因此,我将总路径分成不同的批次来执行,但有时它们会以随机顺序返回。这是因为Google Elevation Service被异步调用(并且没有别的办法)。
所需的结果是在所有批次完成后输出高程数据(即使它只是一批)。所以我想要合并window.setTimeout来按顺序处理调用,但我想知道两件事:
我包装和包装功能但最终没有任何好处。也许有人可以指出我正确的方向?以下是我的伪方法。
function getElevationData(){ var elevator = new google.maps.ElevationService(); var batchSize = 250; var elevationBatches = Math.ceil(directions.routes [0] .overview_path / batchSize);
for(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);
} }
function getElevationBatchData(电梯,批次,数据){ window.setTimeout(function(){ //检查是否已完成的东西..?如果没有再次重新启动此功能?
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); }
对不起代码标记,不知何故;当我在SO中输入更多伪代码时,编辑器不再应用正确的代码格式......
答案 0 :(得分:1)
为什么你不能并行运行所有请求(即使用你的setTimeout方法,但这里很可能没有必要)然后在所有这些请求完成并返回部分结果时显示整体结果?
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);
};