[JS] quasi-synchroon (dmv een stack) ajax calls maken
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!
Gewijzigd op 01/01/1970 01:00:00 door - -
(of begrijp ik je vraag nu verkeerd?)
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.