【问题标题】:window.setTimeout for processing async calls synchronous?window.setTimeout 用于同步处理异步调用?
【发布时间】:2016-03-26 11:14:10
【问题描述】:

我正在开发一种 Google Maps API 功能,该功能包含在路线结果的某个点获取海拔。这对于较小的路线很好,但是具有更多路径的较大路线会成为问题。所以我把总路径分成不同的批次来执行,但有时它们会以随机顺序返回。这是因为 Google Elevation Service 是异步调用的(没有其他方法)。

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

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

    函数 getElevationData() { var 电梯 = 新的 google.maps.ElevationService(); 变量批次大小 = 250; var elevationBatches = Math.ceil(directions.routes[0].overview_path / batchSize);

    for(var i = 0; i

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

    } }

    函数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 的编辑器中输入更多伪代码时,将不再应用正确的代码格式......

【问题讨论】:

    标签: javascript asynchronous synchronization settimeout


    【解决方案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);
     };
    

    【讨论】:

    • 我喜欢这种简洁。我看到了这个概念并解决了这个问题。据我所知,这会很好。谢谢! +1A
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多