2016-05-07 5 views
0

Я использую цикл for для итерации по массиву дат. Этот массив передается в запрос JSON. Проблема в том, что каждый раз, когда он петли, он только вытягивает первый элемент в массиве. Например, он игнорирует i или его кеширование по какой-то причине. Я пробовал два разных подхода, и оба дают мне те же результаты. Какие-либо предложения?

Первый подход

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

    (function(i) { 

    $.getJSON(url + apiKey + "/" + position.coords.latitude + "," + position.coords.longitude + "," + aryDates[i] + "?callback=?", function(data) { 
    var listItem = document.createElement("li"); 

     listItem.className = "js-day-temp"; 
     $('.js-forecast').append(listItem); 
     $('.js-day-temp').html(Math.floor(data.daily.data[0].temperatureMin) + '&#176;'); 
    }); 

    })(i); 
} 

Второй подход

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

$.ajax({ 
    url: url + apiKey + "/" + position.coords.latitude + "," + position.coords.longitude + "," + aryDates[i] + "?callback=?", 
    async: false, 
    dataType: 'json', 
    success: function(data) { 

    var listItem = document.createElement("li"); 
    listItem.className = "js-day-temp"; 
    $('.js-forecast').append(listItem); 
    $('.js-day-temp').html(Math.floor(data.daily.data[0].temperatureMin) + '&#176;'); 
    } 
    }); 

} 

И это, как я тяну даты

function GetDates(startDate, daysToAdd) { 
var aryDates = []; 
var currentDay = []; 

for(var i = 0; i <= daysToAdd; i++) { 
    var currentDate = new Date(); 
    currentDate.setUTCDate(startDate.getUTCDate() + i); 
    currentDay.push(DayAsString(currentDate.getUTCDay())); 
    // aryDates.push(DayAsString(currentDate.getDay()) + ", " +    
currentDate.getDate() + " " + MonthAsString(currentDate.getMonth()) + " " + currentDate.getFullYear()); 
    aryDates.push(currentDate.getUTCFullYear() + "-" + MonthAsString(currentDate.getUTCMonth()) + "-" + ("0" + (currentDate.getUTCDate()+1)).slice(-2) + "T12:00:00-0400"); 
} 

return aryDates; 
return currentDay; 
} 

function MonthAsString(monthIndex) { 
var d=new Date(); 
var month=new Array(); 
month[0]="01"; 
month[1]="02"; 
month[2]="03"; 
month[3]="04"; 
month[4]="05"; 
month[5]="06"; 
month[6]="07"; 
month[7]="08"; 
month[8]="09"; 
month[9]="10"; 
month[10]="11"; 
month[11]="12"; 

return month[monthIndex]; 
} 

function DayAsString(dayIndex) { 
var weekdays = new Array(7); 
weekdays[0] = "Sunday"; 
weekdays[1] = "Monday"; 
weekdays[2] = "Tuesday"; 
weekdays[3] = "Wednesday"; 
weekdays[4] = "Thursday"; 
weekdays[5] = "Friday"; 
weekdays[6] = "Saturday"; 

return weekdays[dayIndex]; 
} 

var startDate = new Date(); 
var aryDates = GetDates(startDate, 7); 
+0

Вы смешиваете синхронный и асинхронный код. Ищите обещания. – Wainage

+0

независимо от того, какой подход вы принимаете, он должен подать 8 запросов, каждый URL-адрес запроса зависит от части даты. Отладили? это должно быть очень легко увидеть в каждом цикле, каково значение i и в разделе сети, вы должны увидеть 8 запросов. –

+0

@AaronShen Да, он возвращает 8 запросов, но не выполняет итерацию через массив. По какой-то причине он запускается 8 раз, но он только вытягивается из массива один раз, тогда следующие запросы дублируются. Вместо того, чтобы проходить через него один за другим. Если я запрошу console.log (aryDates [i]) в запросе JSON, хотя он работает и выполняет итерации через него. Не знаете, почему это не будет в URL-запросе – Aaron

ответ

-1

Догадаться! Вот что я изменил:

$('.js-forecast').append('<li class="js-day-temp ' + 'day-selector' + i + '">' + aryDates[i] + '</li>'); 
$('.js-day-temp.day-selector' + i).html(Math.floor(data.currently.temperature) + '&#176;'); 

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

  • Нет связанных вопросов^_^