Kruse-Net.dk

Det man blogger er man selv...

AJAX aktivitet i Prototype

Som Sergio Pereira beskriver i sine Developer Notes for prototype.js kan man, når man bruger Prototype til at foretage AJAX kald, forholdsvis let tilføje en spinner eller lignende på siden som viser når der er AJAX aktivitet:

Ajax.Responders.register({
	onCreate: function(){
		Element.show('systemWorking');
	},

	onComplete: function() {
		if (Ajax.activeRequestCount == 0) {
			Element.hide('systemWorking');
		}
	}
});

Det har jeg selv brugt flittigt, og undrede mig i dag over en situation hvor denne spinner aldrig forsvandt igen. Nærmere undersøgelser viste at ikke bare blev onComplete funktionen ovenfor aldrig kaldt, Ajax.activeRequestCount blev heller ikke talt ned, på trods af at der tydeligvis kom svar på de pågældende requests.

At activeRequestCount ikke blev talt ned viste sig at være knap så underligt som først antaget. Værdien af denne variabel tælles nemlig op og ned i to helt tilsvarende onCreate og onComplete funktioner der registreres i Ajax.Responders internt i Prototype.

Problemet viser sig delvist at skyldes hvad jeg vil tillade mig at kalde en fejl i Prototype. En del af den kode prototype kører når der kommer svar på en AJAX forespørgsel ser således ud:

try {
  (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
  Ajax.Responders.dispatch('on' + event, this, transport, json);
} catch (e) {
  this.dispatchException(e);
}

Det der står er at Prototype, i en try blok, først forsøger at kalde en onComplete funktion der evt. er givet med som parameter til kaldet. Derefter, i samme try blok aktiveres de onComplete funktioner der er registreret i Ajax.Responders. Problemet er at hvis den “lokale” onComplete funktion afstedkommer en fejl af en art, så bliver de “globale” funktioner aldrig kaldt, hvormed Prototypes regnskab med antallet af åbne linier kører af sporet.

Lektien man kan lære er enten at registrere en global onException funktion (så man får besked når catch blokken ovenfor bliver kørt), eller at sørge for at ens egne onComplete funktioner ikke kan fejle. Og så burde de to linier ovenfor efter min mening køres i hver sin try blok. Problemet er i øvrigt identisk i Prototype 1.4.0 og den nyeste udgave i SVN (1.5.0 RC0).

Skriv en kommentar