[JS] quasi-synchroon (dmv een stack) ajax calls maken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rudie dirkx

rudie dirkx

02/09/2008 03:11:00
Quote Anchor link
Wat ik bedoel is ajax calls niet meteen achter elkaar maken, maar wachten totdat de vorige klaar is. Dat is niet niet-asynchroon, want de rest van javascript moet wel gewoon doorlopen, dus het is nog steeds async. De ajax calls (het ligt aan de gebruiker hoeveel en hoe snel) mogen niet langs elkaar lopen, maar moeten achter elkaar afgehandeld worden. Alleen de calls in de stack!! Er zijn nog andere ajax calls die wel async mogen lopen.

Hier gaat het over:
http://games.hotblocks.nl/140
Als je inlogt zie je een spelletje dat je met de 4 arrowkeys kan 'besturen'. Elke actie (keydown) wordt afgehandeld door Javascript en fouten worden eruitgehaald. Als de actie geldig is, wordt in PHP een controle uitgevoerd en de sessie bijgewerkt. De bedoeling is Javascript voor te laten lopen op PHP, omdat PHP sowieso langzamer is dan de gebruiker zijn acties KAN uitvoeren.

In http://games.hotblocks.nl/140.js wordt duidelijk wat ik bedoel. Alleen functies AddToStack en ProcessStack zijn belangrijk:
* AddToStack wordt uitgevoerd als een actie geldig wordt 'verklaard' door Javascript: de actie wordt opgeslagen in de stack
* ProcessStack loopt de stack af en maakt een-voor-een de ajax calls
De functie Move (user triggered) roept AddToStack aan en AddToStack EN ProcessStack roepen ProcessStack aan. De functies spreken redelijk voor zich.

Dan nu het probleem:
De calls worden NIET een-voor-een gemaakt, maar gewoon zo snel als de user de Move functie triggert. Het probleem is dan dat er meerdere calls tegelijk bezig kunnen zijn en de volgorde van acties (die door PHP geevalueerd moeten worden) door elkaar kan komen.

De functie in PHP die de move calls afhandelt heeft een sleep van 1 sec, dus elke ajax call zou minstens 1000 ms moeten duren. Dat heb ik gedaan zodat duidelijk is hoe het moet werken en hoe het werkt.

Als je 10 keer in 1.5 sec een actie triggert zou in Javascript meteen de 10e actie klaar en het veld bijgewerkt moeten zijn en zou de eerste Ajax call klaar moeten zijn en de tweede nog bezig. Er zouden er NIET al 10 bezig moeten zijn! Ofwel: altijd maar 1 tegelijk: zolang de stack niet leeg is, wordt de volgende call pas gemaakt als de vorige klaar is.

Maar het werkt dus niet :( Waarom niet?

In het script staan voor debug doeleinden een aantal calls naar console.debug(), dus alleen Firefox met Firebug werkt!!
Mocht er iets niet duidelijk zijn - wat dan ook - vraag het hier of stuur me een PM.
Heel erg bedankt!
 
PHP hulp

PHP hulp

25/11/2024 15:11:10
 
- -

- -

02/09/2008 06:10:00
Quote Anchor link
Edit: Het is nog vroeg. Die calls gaan iets verder dan alleen onCreate & onComplete..
Gewijzigd op 01/01/1970 01:00:00 door - -
 
Marien xD

Marien xD

02/09/2008 09:12:00
Quote Anchor link
Zorg ervoor dat je een soort request queue krijg (een array o.i.d.) En dan een process welke elke keer die array gaat doorlopen.

(of begrijp ik je vraag nu verkeerd?)
 
Jelmer -

Jelmer -

02/09/2008 14:39:00
Quote Anchor link
Je haalt een element uit de stack zodra je een request begint, en op basis van de lengte van de stack bepaald je of je de stack wilt gaan afwerken.

Je roept addStackItem aan
-> stack-lengte is 1
-> processStack slaat aan
-> processStack haalt 1 element uit de stack
-> stack-lengte is nu weer 0
-> processStack begint een request
Maar nu tijdens de request roep je weer addStackItem aan:
-> stack-lengte is 0
-> addStackItem()
-> stack-lengte is 1
-> processStack()

etc.

Je moet niet op basis van de stack-lengte bepalen of er nog een request bezig is, maar op basis van iets dat je instelt in onComplete van je request.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.