Stef schreef:Waarom werkt dit niet?
var categories = [];
$(document).ready(function () {
$.ajax({
type: "GET",
url: "soundboard.xml",
cache: false,
dataType: "xml",
success: function(xml) {
$(xml).find(group).each(function(){
categories.push($(this).attr(name));
});
}
});
console.log(categories);
categories.forEach(function(category) {
console.log(category)
});
});
In de console staat alleen de array categories (lijn 15). Maar de forEach lijkt niet te werken

Ah, dit is een leuke..
Je fout is dat je forEach doet, nog voordat er results binnen zijn.
Je wacht niet op de AJAX call (response)
Nu, dan ga je zeggen dat hij in de console wel goed getoond wordt.
Dat komt doordat javascript werkt met references.
Je console laat dus de value van je reference zien, en die wordt later naar result van je AJAX call gezet.
Om dit te fixen, is heel simpel:
$(document).ready(function () {
$.ajax({
type: "GET",
url: "soundboard.xml",
cache: false,
dataType: "xml",
success: function(xml) {
var categories = [];
$(xml).find(group).each(function(){
categories.push($(this).attr(name));
});
showResults(categories);
}
});
function showResults (categories) {
console.log(categories);
categories.forEach(function(category) {
console.log(category)
});
});
});
toevoeging op woensdag 29 maart 2017, 17:54:00:Ik heb ook direct je var categories = [] in je success functie gezet, dit omdat het duidelijker is.
Je geeft de var daarna mee aan showResults.
toevoeging op woensdag 29 maart 2017, 17:57:11:Nu leeft categories als var ook alleen in success function.
Als je de ajax opnieuw doet, dan wordt de var opnieuw aangemaakt, waardoor je niet met nasty reference shit zit.
In je huidige code is dat geen probleem, maar als je bijvoorbeeld die ajax call naar een functie verplaatst en deze wordt meerdere keren aangeroepen.
Dan kan het zijn dat je categories var al gevuld is met andere shit voordat je de vorige hebt afgehandeld.
Daarom, als je array mee geeft aan een functie, en dat moet GEEN reference zijn, doe als volgt:
callThisFunction([].concat(arrayVar));
Dan maak je een nieuwe array aan, met de values van de array op dat moment, als je reference array dan aangepast wordt, dan veranderd de nieuwe array niet in de callThisFunction-functie.
