2013-03-26 4 views
0

Я имею дело с этой проблемой в моем коде Google Maps, но на самом деле это архитектурная проблема. в какой-то момент из-за большого количества запросов карты Google ограничивают ответ, и в этот момент я хочу сделать другой запрос с задержкой, но когда я снова вызову функцию2, он говорит, что «массив не определен».javascript переменная теряется внутри функций

function1() { 
    var array = JSON.parse(xmlhttp.responseText); 

    for (i; i < length; < i++) { 
     function2(array[i].one, array[i].two); 
    } 

    function3() { 
     //render directions 
    } 

    function2(start, end) { 
     directionsService.route({ 
      origin: start, 
      destination: end, 
     }, 

     function (result, status) { 
      if (status == google.maps.DirectionsStatus.OK) 
       function3(result); 
      else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) 
       var functionStr = "function2(array[i].one" + ',' + "array[i].two)"; 
      setTimeout(functionStr, 5000); 
     }); 
    } 

} 

ответ

6

Это потому, что когда вы используете строку кода с setTimeout() он запускается на выполнение в глобальном масштабе, который не знает о array. Глобальная область также не будет знать о i; даже если бы это произошло, значение i уже недействительно.

Он должен работать, если вы заключаете код функции в анонимной функции, например:

setTimeout(function() { 
    function2(start, end); 
}, 5000); 

Пожалуйста, обратите внимание, что вы можете просто повторно использовать start и end здесь, потому что эти ценности были защищены от изменений в i переменная.

Кстати, вы можете рассмотреть возможность сериализации всех ваших запросов Google, то есть один запрос за другим, чтобы предотвратить эти проблемы с тарификацией.

0

Функция в вашем setTimeout выполняется в отдельной области действия, а не в пределах области с вашей переменной массива. Вы можете обернуть его анонимной функцией.

Смотрите здесь: How can I pass a parameter to a setTimeout() callback?

Так что ваш код будет:

function (result, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       function3(result); 
      } else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) { 
       setTimeout(function() { 
        function2(array[i].one, array[i].two); 
       }, 5000); 
      } 
     }); 

Пожалуйста, иметь в виду, что ваш код не хватает скобки {} для вашего если ELSEIF заявление. Я добавил их.

Смежные вопросы