PDA

Volledige versie bekijken : Variabele is Null buiten een functie?


DiD NDSThemes
%Europe/Berlin %845 %2010, 21:17
Ik ben de overstap naar AS3 nog maar pas gemaakt. Na het lezen van vele tutorials en het bekijken van voorbeeld bestanden, wil ik nu zelf aan de slag.

De onderstaande code bezorgd me hoofdpijn. Ik probeer een .ini bestand te laden en de secties en waarden hieruit te halen.
In de functie completeHandler geeft de trace de juiste secties van het bestand weer via de variabele iniSections. In functie init zegt trace dat de variabele iniSections leeg is.

Weet iemand wat ik verkeerd doe? Dank bij voorbaat.


var dataFormat:String = URLLoaderDataFormat.TEXT;
var iniContent:String;
var iniSections:Array;
var iniValues:Array;
var skinURL:String;

init();

function init():void {
skinURL = "dofus/skin.ini";
readINI(skinURL);
trace(iniSections);
}

function readINI(strURL:String)
{
var loader:URLLoader = new URLLoader();
loader.dataFormat = dataFormat;
loader.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(strURL);
try {
loader.load(request);
} catch (error:Error) {
trace("Error loading requested document: " + strURL);
}
}

function completeHandler(event:Event)
{
var loader:URLLoader = URLLoader(event.target);
var regINIsections:RegExp = /\[(.*)\]/g;
var regSplitFile:RegExp = /((.*)\s?)/g;
var nFile:String = loader.data;
iniContent = nFile;
iniSections = nFile.match(regINIsections);
iniValues = nFile.match(regSplitFile);
trace(iniSections);
}

Dauntless
%Europe/Berlin %881 %2010, 22:10
Welkom op FlashFocus!

(We hebben ook [as] tags; Ik heb je post even aangepast)

Het probleem hier is dat init() wordt opgeroepen VOOR dat je data ingeladen is. Stel bv dat je .ini bestand 10 mb is. Het duurt dan wel een voor het ingeladen is. Na (bv) 10 seconden is het bestand ingeladen en wordt completeHandler opgeroepen. init() is echter al 10 seconden geleden opgeroepen en dus nog voor dat de data geladen is.

Oplossing: plaats de init() oproep achteraan in je completeHandler zodat hij wordt opgeroepen wanneer de data ook echt beschikbaar is.

//edit
Sorry, foutje. Splits je init op en plaats de trace regel in een nieuwe functie. Roep die functie dan aan het einde van je completeHandler op. Je fout is een vaak voorkomende beginners fout: Het is niet omdat een regel code vóór een andere regel staat, dat hij ook echt eerst wordt aangeroepen. Zoals ik al zei duurt het even eer de data geladen is en pas op het einde wordt de handler opgeroepen. Flash wacht daar echter niet op (anders zou Flash snel vast hangen) en voert alvast de rest van je programma uit.

DiD NDSThemes
%Europe/Berlin %903 %2010, 22:40
Oops, ben handmatige bbcode gewend. Zal in het vervolg beter opletten. ;)

Bedankt voor het snelle antwoord. Ik had al zo'n klein vermoeden dat mijn fout in die richting te zoeken was. Even voor alle duidelijkheid, onderstaande werkt nu wel. Nogmaals bedankt. Nu proberen dit in een aparte class te steken. :)


var dataFormat:String = URLLoaderDataFormat.TEXT;
var iniContent:String;
var iniSections:Array;
var iniValues:Array;
var skinURL:String;


skinURL = "dofus/skin.ini";
readINI(skinURL);

function init():void {
trace(iniSections);
trace(iniValues);
}

function readINI(strURL:String)
{
var loader:URLLoader = new URLLoader();
loader.dataFormat = dataFormat;
loader.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(strURL);
try {
loader.load(request);
} catch (error:Error) {
trace("Error loading requested document: " + strURL);
}
}

function completeHandler(event:Event)
{
var loader:URLLoader = URLLoader(event.target);
var regINIsections:RegExp = /\[(.*)\]/g;
var regSplitFile:RegExp = /((.*)\s?)/g;
var nFile:String = loader.data;
iniContent = nFile;
iniSections = nFile.match(regINIsections);
iniValues = nFile.match(regSplitFile);
trace(iniSections);
init();
}