2014-10-03 2 views
1

Я пытаюсь сохранить результаты функции json callback в массиве. В основном, что у меня сейчас есть массив gps-координат, которые я просматриваю, и для каждой пары координат я создаю скрипт, который отправляет запросы третьей стороне.Функция динамического json callbak получает только последнее значение

int j = 0; 
while(j < points.length-3) 
{ 
    window['streetNames'+j] = function(json){ 
          console.log("YO",j); 
          streetNames(json, j); 
          }; 

    var reverse = document.createElement('script'); 
    reverse.src = 'http://open.mapquestapi.com/nominatim/v1/reverse.php?format=json&json_callback=streetNames'+j+'&lat='+points[j]+'&lon='+points[j+1]; 
    document.getElementsByTagName('head')[0].appendChild(reverse); 
    j = j + 2; 
} 

Для того, чтобы иметь возможность сохранять результаты в правильном порядке, я должен передать указатель на функцию обратного вызова, и единственным способом я нашел возможным прилипание индекс J с именем функции.

var streets = []; 
function streetNames(json, t) 
{ 
    console.log("in streetNames", t); 
    streets[t] = json.address.road; 
} 

Однако, после выполнения сценария единственного экземпляра, который будет добавлен в массив улицы является последней из массива точек, то один из последнего индекса. Мой вопрос: не все ли gps-координаты запускают функцию ['streetNames' + j] = function (json)? Что я делаю неправильно?

ответ

3

Как отмечено в ответах на дублированный вопрос, Javascript имеет только функциональные возможности, а замыкания принимают переменные по ссылке. Это означает, что все ваши блокировки видят то же самое j, которое в конечном итоге обновляется до последнего значения, которое устанавливает цикл. Вы должны использовать bind. Обратите внимание, что я также заменил int на var и изменил порядок аргументов для streetNames.

var j = 0; 
while(j < points.length-3) 
{ 
    window['streetNames'+j] = streetNames.bind(this, j); 
    // ... 
} 

var streets = []; 
function streetNames(t, json) 
{ 
    console.log("in streetNames", t); 
    streets[t] = json.address.road; 
} 
+0

спасибо большое, что сделал трюк! – user3253067

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