Avatar billede mantichora Nybegynder
29. september 2007 - 17:19 Der er 14 kommentarer og
1 løsning

Den helt rigtige måde at lukke AJAX.

Olebole har tidligere givet mig et par fif om AJAX, bl.a. at man skal oprette et nyt request-objekt for hver side man vil hente, og så lukke dem bagefter.

Nu har jeg så ledt nettet tyndt efter HVORDAN man lukker disse helt korrekt, men kan intet finde.
Jeg er kommet så langt, at jeg sætter http (mit XMLHttpRequest) til null. Altså http = null;

Så langt så godt, men der blev også nævnt at destroye eventhandleren, onreadystatechange. Og hvordan i alverden gør jeg det?

Jeg vil være helt sikker på at min AJAX-kode ikke leaker hukommelse ved længere tids brug. Andre fif er også velkomne.
Avatar billede roenving Novice
29. september 2007 - 17:22 #1
Vel ved at bruge removeEventListener/detachEvent ?-)
Avatar billede mantichora Nybegynder
29. september 2007 - 17:27 #2
Er der forskel på de to?
Og er jeg så helt fri for leaks, hvis jeg gør det, og sætter http = null; ?
Avatar billede roenving Novice
29. september 2007 - 17:35 #3
add-/removeEventListener er DOM-event-handling, attach-/detachEvent er IE-event-modellen ...

-- og for at få et svar, må vi lige have f.eks. olebole ind over ...
Avatar billede mantichora Nybegynder
30. september 2007 - 12:59 #4
Tak for det ellers :) Læg gerne svar.
Avatar billede roenving Novice
03. oktober 2007 - 13:43 #5
Velbekomme '-)
Avatar billede zurekk Nybegynder
03. oktober 2007 - 16:09 #6
Hvad mener du helt præcist med leak af hukommelse?

Jeg er nemlig lige kommet i gang med Ajax, så det kunne jeg godt tænke mig at vide :-)
Avatar billede olebole Juniormester
03. oktober 2007 - 18:05 #7
<ole>

zurekk >> Explorer har en dårlig garbage-collection, hvilket gør, at den kan have svært ved at frigive hukommelse, der burde frigives ... dels i løbet af DOM-operationerne på en side - og dels når man navigerer til en ny side. Det kræver mange, lange forklaringer at lære at undgå memory-leaks i IE.

mantichora >> Om du overhovedet kan fjerne din handler igen, kommer helt anpå, hvad du gør og hvordan. Anonyme funktioner bør således helst ikke anvendes med event-handlers, da de ikke kan kaldes ved en senere fjernelse.

Der skrives enormt meget om AJAX på WWW for tiden, men 95% af det, jeg har set, har været forkert/misforstået. Det er - i modsætning til, hvad man får indtryk af - meget komplekst at bruge AJAX. Man skal være _meget_ stærk i JavaScript og DOM, samt vide en masse om browsernes særheder.

www.dengodekode.dk har jeg en større artikelserie på vej, som omhandler AJAX med henholdsvis JSON- og XML-response, DOM-indsættelser, DOM-sletninger, events, memory-leaks, m.m. - men det hjælper dig jo ikke ligenu  :)

/mvh
</bole>
Avatar billede mantichora Nybegynder
03. oktober 2007 - 22:12 #8
Hov, jeg har lige haft glemt mit spørgsmål lidt. Det må I undskylde - og mange tak for svaret, Ole :)

Dog er jeg ikke så vildt bekymret for, om det nu også er 100% standard-korrekt kode jeg skriver. Ja, jeg ved det - det er en taberholdning, som jeg selv kritiserer hos webdesignere, der f.eks. skider på om det virker på andre browsere end IE, men i dette tilfælde har jeg måtte indse, at jeg ikke kommer til at skrive 100% "korrekt" AJAX lige med det første - så jeg stiller mig tilfreds, bare det virker på IE, Firefox, Opera og Safari.

Men stadig føler jeg ikke helt spørgsmålet er besvaret. Jeg ved godt du ikke KAN besvare det 100%, uden at få mere at vide om hvordan jeg gør, men hvis vi nu antager jeg bare henter en side via JSON, ved at oprette et nyt XMLHttpRequest objekt, og slette det når jeg er færdig, vil jeg så kunne slette min eventhandler med roenvings metode, og vil jeg være fri for leaks?

Jeg opretter gerne et nyt spørgsmål, men jeg er meget interesseret i, at min side kan køre i længere tid, uden at suge alt for meget RAM.
Avatar billede roenving Novice
04. oktober 2007 - 02:24 #9
Som jeg har forstået oles udsagn, vil den mest fornuftige brug af ajax indebære at:

1. Du indføjer dine data i DOM-objekter du kloner

2. At du først sætter event-handlers på objekterne efter de er tilføjet DOM-hierarkiet

3. Ved fjernelse først sletter event-handlers, og derefter fjerner elementerne fra DOM-hierarkiet og sætter dem til null

-- og det var jo nærmest et spørgsmål, ole !-)

PS. Det samme gælder i øvrigt httpRequest-objektet ...
Avatar billede olebole Juniormester
04. oktober 2007 - 13:57 #10
Jo, punkt 1 er ikke vigtig i hukommelses-sammenhæng - men ofte hensigtsmæssig af hensyn til nemhed og bedre overblik (giver ofte slankere kode).

Punkt 2 er vigtig af hensyn til memory-leaks.

Det er punkt 3 også - men langt vanskeligere at opfylde i praksis.

- og så vil jeg tilføje punkt 4: Brug altid POST i XMLHttpRequests ... også af hukommelses-årsager.
Avatar billede olebole Juniormester
04. oktober 2007 - 14:09 #11
- en anden vigtig ting:
Hvis man bruger 'var' inde i en funktion, når man opretter et objekt, kan dette objekt ikke 'nulles' af en anden funktion.

Hvis man i øvrigt passer på at få fjernet handlers, vil det ikke resultere i cross-page-leaks (hukommelsen frigives, når der navigeres til en anden side) - men hvis du opretter 1.000 elementer og fjerner/null'er dem igen, vil de 'hænge' i hukommelsen, til du navigerer væk fra siden.
Avatar billede olebole Juniormester
04. oktober 2007 - 14:11 #12
- forudsat, at man altså opretter elementerne ved brug af 'var' i én funktion - og fjerner/null'er dem i en anden. Det fik jeg vist ikke trykket klart ud  :)
Avatar billede mantichora Nybegynder
04. oktober 2007 - 23:59 #13
Hvis jeg var'er min http-variabel i global space, og sætter den til et new XMLHttpRequest objekt for hver side jeg vil hente, og sætter min onreadystatechange i den funktion, hvor jeg sender http.
Og jeg så sætter http = null; og fjerner eventhandleren i callback-funktionen, som bliver kørt ved onreadystatechange...

... er jeg så hjemme?
Avatar billede olebole Juniormester
06. oktober 2007 - 17:39 #14
Ja, hvad selve objektet angår - men det er ikke til at sige, hvad angår handler'en. Det kommer anpå koden ... det er en lang forklaring  :)
Avatar billede mantichora Nybegynder
07. oktober 2007 - 12:45 #15
Nå :/ Så vil jeg vente i spænding på din artikelserie. Tak ind til videre.
Point?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester