利率受Google地图限制,但不超过限制

时间:2018-01-08 17:15:21

标签: javascript google-maps asynchronous

我使用promises将我的请求限制在客户端Maps Direction API。谷歌的文档说我可以每秒执行10个请求,但我不能这样做,我不知道为什么。

我每3分钟执行18次约20秒的呼叫,并且我每次都在第一轮获得速率限制。

现在很明显,20秒内的18次通话远不到每秒10次。我在读错了信息吗?或误解所有这些是如何工作的?任何帮助都表示赞赏我已经在这里待了太久了。

这是我创建的一个小提琴,用于模拟我正在做的事情:

https://jsfiddle.net/ffauf2bf/1/

我每3分钟拨打一次电话,而不是每分钟拨打18次电话。如果打开控制台,您可以看到每个调用的状态以及调用它的第二个和毫秒。您还会注意到,第一轮通话总是被限制,而每次接下来的一轮通话都是成功的,尽管每一轮通话都没有差异。#/ p>;

我希望这是有道理的!如果您有任何问题,我将很乐意澄清。如果您不想/无法访问jfiddle,我将在下面提供相关代码

const getDistance = async (people, place) => {
  await sleep(500);
  return new Promise((resolve, reject) => {
    let origins = [];
    for(let person of people){
      origins.push(new google.maps.LatLng(person.lat, person.lng));
    }
    const destin = new google.maps.LatLng(place.lat, place.lng);
    const service = new google.maps.DistanceMatrixService();
    service.getDistanceMatrix(
        {
        origins: origins,
        destinations: [destin],
        travelMode: 'DRIVING'
      }, (res, status) => {
        if(status === "OK"){
          console.log(
            status, `${new Date().getSeconds()}:${new Date().getMilliseconds()}`
          );
          let result = {id: place.id, distances: []}
          res.rows.forEach((row, i) => {
          result.distances.push(
                {id: people[i].id, distance: row.elements[0].status}
            );
          });
          resolve(result);
        } else {
          reject(status);
        }
      }
    );
  });
}

由以下人员调用:

const findClosest = () => {
    return new Promise( async (resolve, reject) => {
    let result = [];
    for (let place of places){
      try {
        let distances = await getDistance(people, place);
        result.push(distances);
      } catch(e) {
        reject(e);
      }  
    }
    resolve(result);
  });
}

1 个答案:

答案 0 :(得分:0)

如果有人发现这个,我找到了解决方案。

问题在于我试图限制网络请求的方式。使用这个

const sleep = (ms) => {
    return new Promise(resolve => setTimeout(resolve, ms));
} 

不正确。通过强制我的代码像这样等待,我看到两个函数可能仍然同时触发的行为。

相反,我转而使用lodash,特别是throttle函数。

通过这样做

const asyncFunc = _.throttle(asyncFunc, 250);

您保证每250ms不会多次调用该函数。