2015-03-24 2 views
2

Я использую библиотеку Places в своем приложении javascript. Он отлично работает, когда я использую метод service.nearbySearch() для поиска близлежащих мест. Когда я затем сделаю запрос service.getDetails(), я получаю статус OVER_QUERY_LIMIT для каждого запроса. В моей консоли разработчика я могу отслеживать каждый запрос, сделанный в Google Maps JavaScript API v3, но я не получаю никаких результатов от API мест.Библиотека Google Places OVER_QUERY_LIMIT с новым ключом API

Heres часть кода:

// How I load the library 
<script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=API_KEY"></script> 

// My places request 
var places = new google.maps.places.PlacesService(map); 
var location = new google.maps.LatLng(lat, lng); 
var request = { 
    location: location, 
    radius: radius, 
    types: [type] 
    }; 

places.nearbySearch(request, function(results, status, pagination) { 

    if (status === google.maps.places.PlacesServiceStatus.OK) { 
     for (var i = 0; i < results.length; i++) { 

     // Get the details for each place 
     var detailsRequest = { placeId: results[i].id } 

     places.getDetails(detailsRequest, function(place, status) { 
     if (status == google.maps.places.PlacesServiceStatus.OK) { 
      console.log('PLACE', place) 
     } else { 
      console.log('STATUS', status) 
     }   
    })    
    }; 
} 

Любые идеи?

+0

Вы должны смотреть что означает 'OVER_QUERY_LIMIT' в документации Google Maps. – Andy

+0

Я знаю, что это значит. Я не бил никуда около предела 1к. Гораздо меньше я могу отслеживать, сколько запросов я делаю связанными с моим ключом API. Проблема в том, что он не должен возвращаться вообще – JDillon522

ответ

4

Ответ был тот, что я слишком быстро запросил метод .getDetails(). Docs.

Я повторял несколько десятков мест и слишком быстро просил слишком много. Часто я получаю первые 10 или 12 наших 60 + результатов до ошибки OVER_QUERY_LIMIT.

Я перевел звонок на .getDetails() на событие click для маркера. Таким образом одновременно отправляется только один запрос.

+0

У меня такая же проблема, но мы сохраняем PlaceID в базе данных (потому что мы хотим, чтобы продавец обновлял свою информацию), и когда мы загружаем всех розничных продавцов на карту, мы заблокированы по API. Я не нашел способ избежать этой проблемы, поскольку единственный API, который возвращает местоположение (по крайней мере), это API getDetails. Любая другая идея о том, как это сделать, не сохраняя всю информацию о базе данных? =/ –

+0

@WagnerBertoliniJunior вы нашли решение? Для меня мне нужно получить URL-адреса сайтов ближайших поисковых сайтов, которые находятся только в ответе getDetails :( – benmccallum

+0

@benmccallum no. Кажется, они не хотят, чтобы мы это делали. Я сделал свою собственную логику повтора и продолжаю запрашивать данные когда они позволяют мне это делать, это уменьшает поток данных для чтения. Еще одна вещь, которую я узнал, заключается в том, что если вы открываете новые окна/браузерные вещи, похоже, начинаются с самого начала, может быть, просто рубок. –

1

Также столкнулся с той же проблемой. Похоже, у вас есть пул из 9 или 10 запросов, которые вы можете исчерпать, а затем получите дополнительный запрос каждые 1 с.

Некоторые люди заявили, что серверная версия API допускает 50 запросов в секунду, поэтому я предполагаю, что Google пытается предотвратить перегрузку клиентских экземпляров, что имеет смысл.

Для меня это было достаточно просто иметь UI шоу блесны в то время как getDetails результат/s приходят в Так что я просто задушил запросы после первого 9 или 10, как так:.

nearbySearchCallback: function (places, status) { 
    var that = this; 
    if (status === window.google.maps.places.PlacesServiceStatus.OK) { 
    for (var i = 0; i < places.length; i++) { 
     // You seem to have a pool of 9 or 10 requests to exhaust, 
     // then you get another request every second therein. 
     (function (i) { 
     setTimeout(function() { 
      service.getDetails({ placeId: places[i].place_id }, that.getDetailsCallback); 
     }, i < 9 ? 0 : 1000 * i); 
     })(i); 
    } 
    } 
}, 
getDetailsCallback: function (place, status) { /* ... */ }