2016-05-07 12 views
0

Ich verwende eine for-Schleife, um auf ein Array von Daten zu iterieren. Dieses Array wird an die JSON-Anfrage übergeben. Problem ist, dass jedes Mal, wenn es eine Schleife macht, es nur das erste Element im Array zieht .. wie es i ignoriert oder es aus irgendeinem Grund zwischengespeichert wird. Ich habe zwei verschiedene Ansätze ausprobiert und beide geben mir die gleichen Ergebnisse. Irgendwelche Vorschläge?

Erster Ansatz

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); 
} 

Zweiter Ansatz

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;'); 
    } 
    }); 

} 

Und das ist, wie ich Daten ziehen

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

Sie mischen synchronen und asynchronen Code. Versprechen Sie. – Wainage

+0

egal, welchen Ansatz Sie nehmen, sollte es 8 Anfrage auslösen, jede Anfrage URL variiert am Teil des Datums. Debuggen? Es sollte sehr einfach sein, in jeder Schleife zu sehen, was ist der Wert von i und im Netzwerkbereich sollten Sie die 8 Anfragen sehen. –

+0

@AaronShen Ja, es gibt 8 Anfragen zurück, aber es wird nicht durch das Array iteriert. Aus irgendeinem Grund läuft es 8 Mal, aber es zieht nur aus dem Array, dann sind die folgenden Anfragen Duplikate. Anstatt es nacheinander durchzugehen. Wenn ich console.log (aryDates [i]) innerhalb der JSON-Anfrage, obwohl es perfekt protokolliert und iteriert. Nicht sicher, warum es nicht in der URL-Anfrage – Aaron

Antwort

-1

Herausgefunden! Hier ist, was ich geändert habe:

$('.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;');