[JS]Dubbele AJAX aanroep levert pas resultaat

Pagina: 1
Acties:

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Hallo,

Ik ben bezig met een kleine site en wil een foto vieuwer maken.
Nu ben ik aan het programeren geslagen en dit gemaakt:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var http = new createRequestObject;
var Busy = false;
var CurrentPhoto = 0;

function getPhoto(UserID, PhotoID)
{
    if(http.readyState == 4 && this.Busy == true)
    {       
        this.Busy = false;
        var Response = http.responseText;
        this.http = new createRequestObject;
        return Response;
    }
    else if(http.readyState == 0)
    {
        http.open('get', 'http://site.nl/External/getPhoto.php?uid=' + UserID + '&pid=' + PhotoID);
        http.onreadystatechange = getPhoto;
        http.send(null);
        this.Busy = true;
    }
}


Maar nu komt het vreemde. Wil ik de gereturnde content gebruiken moet ik deze functie 2x aanroepen. De eerste keer geeft hij undifined terug, en de 2x gewoon de goede content.
Zo ziet die code er uit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
function changePhoto(Direction, UserID)
{   
    this.getPhotoCount(UserID)
    if(this.CurrentPhoto + Direction > 0 && this.CurrentPhoto + Direction <= this.getPhotoCount(UserID))
    {
        this.getPhoto(CurrentPhoto + Direction, UserID)
        document.getElementById('PhotoDisplay').innerHTML = '<img src="'+ this.getPhoto(CurrentPhoto + Direction, UserID) +'" />';
        CurrentPhoto = CurrentPhoto + Direction;
    }
}


Wat doe ik fout dat ik hier nu gewoon geen goede output krijg?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Je doet een asynchroon request en je scriptje loopt gewoon door zonder dat er resultaat is. Pas veel later is het resultaat aanwezig. De voglende keer dat je de functie aanroept is het resultaat van de vorige nog wel beschikbaar dus krijg je wel het juiste resultaat.

Je denkfout is dat je denkt dat getPhoto pas returned als er wat terug gegeven is, maar de functie loopt gewoon door na het request en returnt dus niks.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Dus zou ik ook op http.readyState moeten doen in changePhoto, zoals jij suggureert. Of de Busy variable gebruiken in een while loop.

Of ik maak gewoon gebruik van 2 functies...

[ Voor 15% gewijzigd door Depress op 03-05-2007 13:43 ]


Verwijderd

Depress schreef op donderdag 03 mei 2007 @ 13:41:
Dus zou ik ook op http.readyState moeten doen in changePhoto, zoals jij suggureert. Of de Busy variable gebruiken in een while loop.

Of ik maak gewoon gebruik van 2 functies...
Waarom moet het een asynchroon request zijn?
JavaScript:
1
http.open('get', 'http://site.nl/External/getPhoto.php?uid=' + UserID + '&pid=' + PhotoID, false);

(let op de false)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Je moet het stukje dat je uitgevoerd wilt hebben nav het resultaat van je ajaxrequest in een apparte functie zetten die je op de onReadyState aanroept. Daar moet je dus de document.elementById en CurrentPhoto = regeltjes bijzetten. Een andere oplossing is om je request synchroon te doen. Je request functie blijft dan blocken tot er een resultaat is. Hoe dat precies gaat moet je even uitzoeken. Dat weet ik zo niet uit mijn hoofd.

--Ah, mijn bovenbuurman wist het wel uit zijn hoofd--

[ Voor 6% gewijzigd door Janoz op 03-05-2007 15:16 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 09:00

crisp

Devver

Pixelated

Grappig ook hoe je overal 'this' gebruikt; ben je er wel zeker van in welke scope die functies worden uitgevoerd? ;)

Overigens is de async parameter voor de open() method niet optional.

Verder zou ik de hele readystate-handling in een aparte functie doen of eventueel in een anonymous function waarbinnen je je http-object instance kan enclosen. Ik vind wat je nu hebt nogal een vreemde constructie...

Intentionally left blank

Pagina: 1