Попробуйте Catch для сообщения об ошибке в google maps api

Я использую javascript и получаю сообщение о том, что я превысил свою ежедневную квоту для запроса для этого API. Есть ли способ захватить это сообщение об ошибке в блоке catch try, поэтому, когда я перехожу к своей квоте, я могу выполнить еще одну часть кода. Я видел несколько подобных сообщений, но ничего полезного. Вот мой код.

(function (window, google, lat, lng) {
           var options = {
               center: {
                   lat: Number(lat),
                   lng: Number(lng)
               },
                 zoom: 5,
                 disableDefaultUI: true,
                 scrollwheel: true,
                 draggable: false
           },
           element = document.getElementById('map-canvas')
           var map = new google.maps.Map(element, options)
       }(window, window.google, result[i]['latitude'], result[i]['longitude']));

Ответ 1

Обновление В соответствии с documentation:

если вы хотите программно обнаружить отказ аутентификации (например, для автоматической отправки маяка), вы можете подготовить функцию обратного вызова. Если определена глобальная функция, она будет вызываться, когда аутентификация завершится с ошибкой. function gm_authFailure() {//code}

Вот список ошибок, которые должна улавливать функция gm_authFaliure. В нем также упоминается ошибка OverQuotaMapError.

В соответствии с документация:

если в течение определенного периода времени выполняется слишком много запросов, API возвращает код ответа OVER_QUERY_LIMIT.

Итак, вы должны проверить код ответа. Если библиотека javascript Google maps не позволяет получить доступ к коду ответа, я рекомендую сделать HTTP-запрос API для получения кода ответа.

function initMap(window, google, lat, lng) {
   var options = {
       center: {
           lat: Number(lat),
           lng: Number(lng)
       },
       zoom: 5,
       disableDefaultUI: true,
       scrollwheel: true,
       draggable: false
   },
   element = document.getElementById('map-canvas'),
   map = new google.maps.Map(element, options);
};

function googleMapsCustomError(){
    alert('Google Maps custom error triggered');
}

// if you want to respond to a specific error, you may hack the
// console to intercept messages.
// check if a message is a Google Map error message and respond
// accordingly
(function takeOverConsole() { // taken from http://tobyho.com/2012/07/27/taking-over-console-log/
    var console = window.console
    if (!console) return

    function intercept(method) {
        var original = console[method]
        console[method] = function() {
           // check message
           if(arguments[0] && arguments[0].indexOf('OverQuotaMapError') !== -1) {
             googleMapsCustomError();
           }
           
            if (original.apply) {
                // Do this for normal browsers
                original.apply(console, arguments)
            } else {
                // Do this for IE
                var message = Array.prototype.slice.apply(arguments).join(' ')
                original(message)
            }
        }
    }
    var methods = ['error']; // only interested in the console.error method
    for (var i = 0; i < methods.length; i++)
        intercept(methods[i])
}())
<!DOCTYPE html>
<div id="map-canvas"></div>

<script>
// Notice i am defining this within my html file, just to be sure that this function exists before the Google Maps API is loaded.
window.gm_authFailure = function() {
    // remove the map div or maybe call another API to load map
   // maybe display a useful message to the user
   alert('Google maps failed to load!');
}

window.showMap = function() {
  var lat = -34.397,
      lng = 150.644;
  initMap(window, window.google, lat, lng);
};
</script>

<!-- We are passing an invalid API key. Also notice that we have defined 'callback' as 'showMap' which means that when the Google API JavaScript library is finished loading it will call the 'showMap' function. -->
<script src="https://maps.googleapis.com/maps/api/js?key=INVALID_API_KEY&callback=showMap"
    async defer></script>

Ответ 2

Согласно документации Google.

Если вы превысите пределы использования, вы получите статус OVER_QUERY_LIMIT кода в качестве ответа.

Это означает, что веб-служба перестанет обеспечивать нормальные ответы и переключиться на возврат только кода состояния OVER_QUERY_LIMIT, пока больше использование разрешено снова. Это может произойти:

  • В течение нескольких секунд, если ошибка получена, потому что ваше приложение отправляет слишком много запросов в секунду.

  • В течение следующих 24 часов, если ошибка получена, потому что ваше приложение отправляет слишком много запросов в день. Ежедневные квоты reset в полночь, в тихоокеанское время.

Обратитесь эта ссылка. Было бы полезно.

Ответ 3

Да, JavaScript поддерживает блоки try-catch. Вот пример реализации для вашего кода:

(function (window, google, lat, lng) {
           var options = {
               center: {
                   lat: Number(lat),
                   lng: Number(lng)
               },
                 zoom: 5,
                 disableDefaultUI: true,
                 scrollwheel: true,
                 draggable: false
           },
           element = document.getElementById('map-canvas')
           try {
               var map = new google.maps.Map(element, options)
           } catch (error) {
               // handle error
               console.log(error.message);
           } finally {
               // optional cleanup code
           }
       }(window, window.google, result[i]['latitude'], result[i]['longitude']));