window.setTimeout用于处理异步调用同步?

时间:2016-03-26 11:14:10

标签: javascript asynchronous synchronization settimeout

我正在使用Google Maps API功能,该功能包含在路线结果的某个点获取高程。这适用于较小的路线,但路径较多的较大路线成为问题。因此,我将总路径分成不同的批次来执行,但有时它们会以随机顺序返回。这是因为Google Elevation Service被异步调用(并且没有别的办法)。

所需的结果是在所有批次完成后输出高程数据(即使它只是一批)。所以我想要合并window.setTimeout来按顺序处理调用,但我想知道两件事:

  1. 这是一个好方法,还是有更好的选择?
  2. 我包装和包装功能但最终没有任何好处。也许有人可以指出我正确的方向?以下是我的伪方法。

    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); }

  3. 对不起代码标记,不知何故;当我在SO中输入更多伪代码时,编辑器不再应用正确的代码格式......

1 个答案:

答案 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);
 };