2015-02-16 4 views
1

Так что я работал над jquery отложенным, но у меня возникают проблемы при получении данных в цикле. Отложенная часть, по-видимому, обрабатывает данные только с последней итерации. Если в массиве есть только один элемент, он также терпит неудачу, поэтому я не уверен, что происходит.jquery отложен в цикле

У меня есть различные названия городов, и я пытаюсь получить центральные координаты для каждого города с карты Google реверса геокодированного

Вот моя функция, которая получает центральные координаты:

function getGroupLatLng(groupname){ 
    var deferred = new $.Deferred(); 

    geocoder.geocode({ 'address': groupname}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
       deferred.resolve(results); 

      alert(results[0].geometry.location.lat()); 
     } else { 

     } 

    }); 
    return deferred.promise(); 
} 

Это где функция вызывается, и DIV добавляется после того, как результат возвращается:

var newGroupsLength = newGroups.length; 

for (i = 0; i < newGroupsLength; i++) { 

    newGroups[i]['counter']=counter; 
    var locationName = newGroups[i]['name']; 
    counter++; 
    alert(locationName); 
    $.when(getGroupLatLng(locationName)).then(function(results){ 
     alert("lat = "+results[0].geometry.location.lat()); 
     var lat=results[0].geometry.location.lat(); 
     var lng=results[0].geometry.location.lng(); 
     console.log(newGroups[i]); //this is running the proper number of times, but it logs the results from the final looped item, 'n' number of times. 

     newGroups[i]['lat']=lat; 
     newGroups[i]['lng']=lng; 

     var jsonArray=[]; 
     jsonArray = newGroups[i]; 
     var template = $('#groupsTemplate').html(); 
     var html = Mustache.to_html(template, jsonArray); 
     $('#groups-container').append(html); 
    }); 
} 

проблема, которую я имею в том, что отложенный цикл кажется т o обрабатывать последний элемент в цикле цикла «n», а «n» - количество элементов в массиве newGroupsLength. Конечно, он должен обрабатывать каждый элемент один раз. Если отложенное действие удалено, все работает отлично.

Искренне благодарит за любую помощь. Это очень ценится

ответ

1

Существует два факта, которые сотрудничают, чтобы дать такой результат:

  1. При написании объекта в журнал, это ссылка на объект, который написан, а не копия данных , Если объект изменяется после регистрации, журнал покажет измененные данные.

  2. Цикл уже завершен до того, как функция обратного вызова для then называется в первый раз. Это означает, что i будет иметь одинаковое значение для всех обратных вызовов, поэтому вы ставите все результаты на один и тот же объект.

Таким образом, значение в newGroups[i] будет изменяться для каждого ответа, который обрабатывается, но вы будете видеть только последние значения в журнале, потому что это то, что объект содержит по времени журнал показывает его.

Для каждой итерации в цикле сохранить значение i для позже, когда приходит ответ, вы можете использовать IIFE (немедленно вызываемыми выражение функции), чтобы создать локальную переменную для каждой итерации:

var newGroupsLength = newGroups.length; 

for (i = 0; i < newGroupsLength; i++) { 

    (function(i){ 

    newGroups[i]['counter']=counter; 
    var locationName = newGroups[i]['name']; 
    counter++; 
    alert(locationName); 
    $.when(getGroupLatLng(locationName)).then(function(results){ 
     alert("lat = "+results[0].geometry.location.lat()); 
     var lat=results[0].geometry.location.lat(); 
     var lng=results[0].geometry.location.lng(); 

     newGroups[i]['lat']=lat; 
     newGroups[i]['lng']=lng; 

     console.log(newGroups[i]); // log the object after setting the values 

     var jsonArray=[]; 
     jsonArray = newGroups[i]; 
     var template = $('#groupsTemplate').html(); 
     var html = Mustache.to_html(template, jsonArray); 
     $('#groups-container').append(html); 
    }); 

    })(i); 

} 
+0

Вау. огромное спасибо. Аспект console.log имеет смысл. Я не знал, что ведет себя так. Первоначально ничто внутри функции (i) {} не работает, но я продолжаю работать над ней и возвращаться к вам. – ambe5960

+0

ошибка на моем конце. Спасибо вам много ... хотя проблема была решена, объяснение было неоценимым. – ambe5960

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