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

标签 javascript asynchronous synchronization settimeout

我正在开发 Google map API 功能,其中包含获取路线结果中某个点的海拔高度。这对于较小的路线来说很好,但是具有更多路径的较大路线就会成为问题。因此,我将总路径分成单独的批处理来执行,但有时它们以随机顺序返回。这是因为 Google Elevation Service 是异步调用的(没有其他方法)。

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

  1. 这是一个好方法,还是有更好的替代方案?
  2. 我不断地包装功能,但最终没有得到任何好处。也许有人可以指出我正确的方向?下面是我的伪方法。

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

    for(var i = 0; i < heightBatches; 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);
    

    } }

    函数 getElevationBatchData(电梯, 批处理, 数据) { window.setTimeout(函数() { //检查它是否已经完成..?如果没有,再次重新触发该函数?

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

最佳答案

为什么不能并行运行所有请求(即使用 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);
 };

关于javascript - window.setTimeout 用于处理异步调用同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36234597/

相关文章:

javascript - 单击 1 次按钮即可停止 3 个图像旋转

Javascript:在函数调用问题上跳过参数(未定义)

c# - 任务完成源 : When to use SetResult() versus TrySetResult(), 等

java - 如何使用 objectId 或 hashcode 对对象进行同步?

java - 同步和线程

java - 当组合框值更改时,动态更新数据库中的文本框值

javascript - 你如何在计时器中调用启动和停止功能

c# - 仅使用 async/await 时是否存在竞争条件?

ajax - 多个异步ajax请求中laravel 5中的CSRF token 不匹配错误?

javascript - 使用 EventSourcing(NodeJS、MongoDB、JSON)跨多个偶尔连接的客户端同步数据