setTimeout für eine Objektinterne Funktion?
Rene Rose
- javascript
Hallo Community!
Ich habe ein Problem mit dem Verständnis, bzw. der Anwendung von "setTimeout()". ich habe ein Objekt, das eine Datei ausliest und die enthaltenen Daten zerlegt. Die Daten werden über Eigenschaften nach außen zugänglich gemacht. Ich möchte, dass die Lesefunktion regelmäßig eigenständig startet, so dass ich das Objekt jederzeit nach aktuellen Daten abfragen kann. Soweit mein Idealbild.
Ich habe zwei Methoden eingefügt, die das Objekt praktisch starten und wieder anhalten sollen. Leider liefert mit der Aufruf der "setTimeout()" Funktion immer einen Fehler, ohne nähere Beschreibung ("Objekt erforderlich in Zeile 0"). Nachdem ich eine Weile experimentiert habe, scheint es so zu sein, dass die Funktion "setTimeout" die objektinterne Funktion "ParseData()" nicht findet. Eine Bastellösung wäre, das Objekt von außen regelmässig zu refreshen. Eleganter wäre es jedoch, dass es eigenständig "tickt". Wo liegt das Problem, bzw. mein Fehler?
function InfoReader( objPathHandler )
{
var arrStringParts = Array();
var strSymbolName, strTimeFrame, strStartTime, strStartDate, strPositionInfo;
var strTickSize, strLastClose, strFileName, strFileData;
strFileName = GetBuildPath( objPathHandler.DataPath, objPathHandler.InfoFile );
//Funktion liest den Inhalt einer Datendatei und splitte die Informationen auf
function ParseData()
{
try { strFileData = folderBR.Read( strFileName, ".txt" ); }
catch (err) { strFileData = "" }
arrStringParts = strFileData.split(";");
if ( arrStringParts.length >= 0 )
{
strSymbolname = arrStringParts[0];
strTimeFrame = arrStringParts[1];
strStartTime = arrStringParts[2];
strStartDate = arrStringParts[3];
strPositionInfo = arrStringParts[4];
strLastClose = parseFloat(arrStringParts[5].replace(/,/, "."));
strTickSize = parseFloat(arrStringParts[6].replace(/,/, "."));
}
setTimeout( "ParseData()", 1000 );
}
//Methode startet das periodische lesen der Daten
this.Start = function()
{ ParseData(); }
//Methode beendet das periodische Lesen der Daten
this.Stop = function(){ clearTimeout("ParseData()"); }
this.Symbol = strSymbolName;
this.TimeFrame = strTimeFrame;
this.StartTime = strStartTime;
this.StartDate = strStartDate;
this.Position = strPositionInfo;
this.Last = strLastClose;
this.TickSize = strTickSize;
}
Hi,
Ich habe zwei Methoden eingefügt, die das Objekt praktisch starten und wieder anhalten sollen. Leider liefert mit der Aufruf der "setTimeout()" Funktion immer einen Fehler, ohne nähere Beschreibung ("Objekt erforderlich in Zeile 0"). Nachdem ich eine Weile experimentiert habe, scheint es so zu sein, dass die Funktion "setTimeout" die objektinterne Funktion "ParseData()" nicht findet.
Kann sie auch nicht. setTimeout wird im Kontext von window ausgefuehrt - dein ParseData ist aber keine Methode des window-Objektes, sondern deines eigenen Objektes.
Loesung:
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object-methoden-und-kontext
MfG ChrisB
Hallo,
setTimeout( "ParseData()", 1000 );
Schreib einfach window.setTimeout(ParseData, 1000).
Durch die Verschachtelung wirkt ParseData als Closure und hat bei jeder Ausführung Zugriff auf die lokalen Variablen von InfoReader.
In ihr kannst du aber nicht über this auf die Instanz zugreifen.
Das ginge durch etwa durch folgende Hilfskonstruktion:
var self = this;
setTimeout(function () { ParseDate.call(self); }, 1000);
Aber auf this scheinst du ja ohnehin nicht zuzugreifen.
Mathias