Intervalle automatisch mit ihren Objekten löschen

Tobias Menzel

Erfahrenes Mitglied
Hallo,

wer oft mit setInterval und dynamisch eingeladenen/instanzierten MovieClips arbeitet, kennt das Problem: Bei einem Wechsel der Inhalte müssen ggf. alle Intervalle "per Hand" gelöscht werden, da diese sonst bis in alle Ewigkeit weiterlaufen, auch wenn das auslösende Objekt nicht mehr existiert.

Mit dieser kleinen Klasse (deren Existenz auf jenes Problem zurückgeht) lässt sich dieses Problem beheben; das "SmartInterval" prüft bei jedem Aufruf die Existenz des Zielobjektes und löschst sich ggf. selbst:
Code:
class smartInterval {

    var OBJ:Object;
    
    function smartInterval(interval:Number, fn:Function, dest:MovieClip) {
        OBJ = new Object();
        OBJ.DC = dest;
        OBJ.FN = fn;
        OBJ.timestamp = getTimer();
        OBJ.DC["stamp" + OBJ.timestamp] = OBJ.timestamp;
        OBJ.interval = function() {
            if (this.DC["stamp" + this.timestamp] == this.timestamp) {
                this.FN();
            } else {
                clearInterval(this.IV);
            }
        }
        OBJ.IV = setInterval(OBJ, "interval", interval);
    }
}

Aufruf z.B.:
Code:
var iv1 = new smartInterval(8000, function() { doSomething(); }, this);

function doSomething() {
    // sonstwas
}

Grüße,

Tobi
 
Aus gegebenem Anlass hier noch ein kleiner Prototype zum einmaligen Ausführen von Invervallen. Der Name der Callback-Methode wird als String übergeben:
Code:
MovieClip.prototype.setTimeOut = function(interval, fn) {
	var iv = "timeOutInterval_" + getTimer() + "_" + int(Math.random() * 9999);
	var that = this;
	var cbFunc = function() {
		clearInterval(that[iv]);
		delete that[iv];
		that[fn]();
	}
	this[iv] = setInterval(cbFunc, interval);
}

// Aufruf:

this.setTimeOut(2000, "machWas");

function machWas() {
	trace("Hallo: " + this);
}

Grüße
.
 

Neue Beiträge

Zurück