Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 价格受谷歌地图限制,但不超过限制_Javascript_Google Maps_Asynchronous - Fatal编程技术网

Javascript 价格受谷歌地图限制,但不超过限制

Javascript 价格受谷歌地图限制,但不超过限制,javascript,google-maps,asynchronous,Javascript,Google Maps,Asynchronous,我使用承诺将我的请求限制为客户端映射方向API。谷歌的文档说我可以每秒执行10个请求,但我不能这样做,我也不知道为什么 我每3分钟在大约20秒的时间内打18个电话,每次第一轮都会受到费率限制 很明显,20秒内打18个电话比每秒10个要少得多。我读错信息了吗?还是误解了这一切是如何运作的?谢谢你的帮助,我在这方面做得太久了 下面是我为模拟我正在做的事情而制作的小提琴: 我将它设置为每分钟运行一次,而不是每3分钟18次。如果打开控制台,您可以看到每次调用的状态以及调用的秒数和毫秒数。您还将注意到,

我使用承诺将我的请求限制为客户端映射方向API。谷歌的文档说我可以每秒执行10个请求,但我不能这样做,我也不知道为什么

我每3分钟在大约20秒的时间内打18个电话,每次第一轮都会受到费率限制

很明显,20秒内打18个电话比每秒10个要少得多。我读错信息了吗?还是误解了这一切是如何运作的?谢谢你的帮助,我在这方面做得太久了

下面是我为模拟我正在做的事情而制作的小提琴:

我将它设置为每分钟运行一次,而不是每3分钟18次。如果打开控制台,您可以看到每次调用的状态以及调用的秒数和毫秒数。您还将注意到,第一轮呼叫的评级总是有限的,而随后的每一轮呼叫都是成功的,尽管每个“轮”之间没有差异

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

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

如果有人发现了这一点,我已经找到了解决办法

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

const sleep = (ms) => {
    return new Promise(resolve => setTimeout(resolve, ms));
} 
这是不正确的。通过强制我的代码像这样等待,我看到了两个函数仍可能同时启动的行为

相反,我转而使用lodash,特别是
节流功能

通过这样做

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

您保证该函数不会每250ms调用一次以上

我相信你达到了极限,因为你的元素太多了。根据,注意:发送到距离矩阵服务的每个查询都受到允许元素数量的限制,其中来源的数量乘以目的地的数量定义了元素的数量。fiddle为我工作(我没有看到任何失败)。您是否阅读了“使用限制和策略”下的“注意事项”在哪里?@geocodezip这太奇怪了。。。第一次对我来说每次都失败了。我每秒不超过100个元素,每秒不超过10个请求,没有其他用户共享我的密钥。我从根本上理解为什么我会收到错误,但对我来说,我似乎没有超过任何配额。如果我每250ms发送12个元素,那么每秒只有48个元素,每秒有4个请求,所以每次都应该可以工作,但事实并非如此