ugrás a tartalomhoz

Közösségi játékom

Totti 1986 · 2010. Május. 23. (V), 10.48
Először is bocs a címért, jelen kérdésem csak egy "Javascript fgv. késleltetése az AJAX lefutásáig" lenne, de valószínűleg később lesz más kérdésem is és szeretném, ha az egész egy témában lenne.

A mostani problémám a következő:
Épp a játék bejelentkezés; szoba - és ellenfél-adatok folyamatos frissítése AJAX-szal részénél tartok, és ez még tökéletesen fut is.

Most egy Kilépés gombot csinálnék, ami kilépteti a játékost, majd lefuttat egy fgv.-t, ami beállítja a kezdőadatokat és behozza a kezdőoldali menüt.
  1. function logout() {  
  2.     show_over_msg('logout''info');  
  3.     // call player_update setting logout var  
  4.     player_update('&logout=1');  
  5.     // call start  
  6.     start();  
  7. }  
  8.   
  9. function player_update(update_string) {  
  10.     xmlhttp = GetXmlHttpObject();  
  11.     if(xmlhttp == null) {  
  12.         alert ('Browser does not support HTTP Request');  
  13.         return;  
  14.     }  
  15.     nocache = Math.random();  
  16.     var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;  
  17.     xmlhttp.open('GET',url,true);  
  18.     xmlhttp.send(null);  
  19. }  
  20.   
  21. function start() {  
  22.     // ez eleg hosszu nem masolom be, ez allitja be a kezdoadatokat  
  23.     hide_over_msg();  
  24. }  
Ezzel ugye az a baj, hogy a player_update() után rögtön lefut a start() és felülírja a requestet, vagyis nem fut le a játékos kiléptetésének php fájlja.

Lehetne az a megoldás, hogy a player_update-be teszek egy onreadystatechange-et, és abba a start()-ot, de az a baj, hogy a player_update fgv.-t sok már fgv. is meghívja, mindig, ha vmit épp át kell írni (megnyert meccs, beállítások).

Azt akarom elkerülni, hogy az onreadystatechange-et szét kelljen ifezni, hogy ha a logout hivta meg, akkor ezt csinálja, ha egy másik fgv. akkor meg azt.

Kipróbáltam, hogy return-nel visszaadok egy 1-est, ha lefutott a request, de a logout fgv. nem várja meg, és az
  1. if(player_update('&logout=1') == 1)  
"undefined"-ot ad vissza.

Azt szeretném, ha bármelyik fgv. ha meghív egy olyan fgv.-t, amiben request van, akkor várja meg míg lefut, és csak azután hívjon meg egy másik olyan fgv.-t, amiben egy másik request van, anélkül, hogy az 1. request-es fgv.-t kellene szétifezni.
 
1

Csinálj egy olyan osztályt

mgergo90 · 2010. Május. 23. (V), 12.18
Csinálj egy olyan osztályt ami a HTTPRequest objektumot kezeli. Ennek a paraméterei között add meg a függvény nevét amit meg akarsz hívni a kérés végrehajtása után. Majd értelemszerűen, egy readyStatus==4 esetén meghívod a függvényt amit átadtál paraméterként.
2

fgv. paraméterben?

Totti 1986 · 2010. Május. 23. (V), 12.26
Ilyet már próbáltam, de ha paraméterben átadok egy fgv.-t, akkor azt nem tudom meghívni.
3

Én is próbáltam már ilyet,

mgergo90 · 2010. Május. 23. (V), 12.46
Én is próbáltam már ilyet, nem véletlen írom, és meg lehet csinálni.
4

ha ez működik

Totti 1986 · 2010. Május. 23. (V), 13.16
ha ez működik, akkor ennyivel is elintézhetem:
  1. function player_update(update_string, after_call_func) {  
  2.     xmlhttp = GetXmlHttpObject();  
  3.     if(xmlhttp == null) {  
  4.         alert ('Browser does not support HTTP Request');  
  5.         return;  
  6.     }  
  7.     nocache = Math.random();  
  8.     var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;  
  9.     xmlhttp.onreadystatechange = function() {  
  10.         if(xmlhttp.readyState == 4) {  
  11.             after_call_func;  
  12.         }  
  13.     }  
  14.     xmlhttp.open('GET',url,true);  
  15.     xmlhttp.send(null);  
  16. }  
És így akkor ha átadok egy fgv.-t, h mi fusson le, akkor az fut le, és mindig megvárja.
De így, h after_call_func; a readyState-ben nem futtatja le a paramétert. Én így pőróbáltam, és így nem sikerült, ezért gondolkodtam, h máshogy kéne.
Hogy futtatok le átadott paraméterben lévő fgv.-t?
5

Zárójel

janoszen · 2010. Május. 23. (V), 13.18
Mondjuk így:

after_call_func();
6

A várt elem függvény

Totti 1986 · 2010. Május. 23. (V), 13.39
Nem akarok síkhülyének tűnni, de hibaüzenet van, hogy a várt elem függvény. Én értem is, hogy hibaüzenet van, de így komolyan le kéne futnia?
  1. function player_update(update_string, after_call_func) {  
  2.     xmlhttp = GetXmlHttpObject();  
  3.     if(xmlhttp == null) {  
  4.         alert ('Browser does not support HTTP Request');  
  5.         return;  
  6.     }  
  7.     nocache = Math.random();  
  8.     var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;  
  9.     xmlhttp.onreadystatechange = function() {  
  10.         if(xmlhttp.readyState == 4) {  
  11.             if(after_call_func != '') {  
  12.                 after_call_func();  
  13.             }  
  14.         }  
  15.     }  
  16.     xmlhttp.open('GET',url,true);  
  17.     xmlhttp.send(null);  
  18. }  
7

Nem jól adod át

janoszen · 2010. Május. 23. (V), 14.14
Nem jól adod át a függvényt. Valahogy így kéne kinéznie a meghívásnak:

function myCallbackFunc()
{
}
player_update("whatever", myCallbackFunc);


Nagyon figyelj arra, hogy NE így hívd meg:

player_update("whatever", myCallbackFunc());


Ekkor ugyanis lefuttatja a függvényt és annak eredményét fogja visszaadni. Neked csak a függvény neve kell oda zárójelek nélkül.
8

Nincs zárójel

Totti 1986 · 2010. Május. 23. (V), 15.47
szerintem félreértjük egymást:)

a te példádban myCallbackFunc a fgv. neve?

akkor leírom, nálam hogy van, és akkor tiszta lesz, h hogy adom át, és látszani fog a hiba.

tegyük fel, van 2 fgv.-em, ami meghívja a player_update fgv.-t. Az egyik a logout(), a másik mondjuk you_won() fgv.

akkor így néznek ki a fgv.-ek
  1. function logout() {  
  2.     // ...  
  3.     player_update('&logout=1','start');  
  4. }  
  5.   
  6. function you_won() {  
  7.     // ...  
  8.     player_update('&won=1','show_rooms');  
  9. }  
  10.   
  11.   
  12. function start() {  
  13.     // ...  
  14.     // beallitja a kezdoertekeket  
  15. }  
  16.   
  17. function show_rooms() {  
  18.     // ...  
  19.     // visszater a szobak listajahoz  
  20. }  
  21.   
  22. function player_update(update_string, then_call_func) {  
  23.     xmlhttp = GetXmlHttpObject();  
  24.     if(xmlhttp == null) {  
  25.         alert ('Browser does not support HTTP Request');  
  26.         return;  
  27.     }  
  28.     nocache = Math.random();  
  29.     var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;  
  30.     xmlhttp.onreadystatechange = function() {  
  31.         if(xmlhttp.readyState == 4) {  
  32.             if(then_call_func != '') {  
  33.                 then_call_func();  
  34.             }  
  35.         }  
  36.     }  
  37.     xmlhttp.open('GET',url,true);  
  38.     xmlhttp.send(null);  
  39. }  
Szóval én azt szeretném elérni, hogy a then_call_func, az egy paraméter legyen, attól függően, mit akarok a játékos adatmódosítása után meghívni.
És ez az a mód, ahogy nem tudom lefuttatni, vagy meghívni a paraméterben átadott fgv.-t
9

Nem

janoszen · 2010. Május. 23. (V), 16.53
Nem, nem a fuggveny neve hanem maga a fuggveny. Vedd ki az idezojeleket a meghivasnal. JSben ugyanis tudsz fuggvenyeket atadni onmagukban.

Szerk: lehet, hogy ehhez a fv-t igy kell deklaralni, fejbol nem tudom:

var fv = function() {};
10

Prototype keretrendszer

rrd · 2010. Május. 23. (V), 16.54
Prototype keretrendszer használata esetén megnéz tudod adni, hogy az ajax hívás aszinkron legyen vagy sem. Szerintem egy ilyen összetett feladatnál mindenféleképpen nyernél egy hari keretrendszer használatával.
11

var fv = function() {};

Totti 1986 · 2010. Május. 24. (H), 12.49
nos, proclub, ezzel a deklarálással tényleg meghívja, és így jó is, nagyon köszi!
viszont akkor az összes fgv.-t át kéne írnom majd ilyen deklarálásra, mert nem tudom még, hogy később meg fogom-e hívni vmelyiket és akkor kell majd átírnom, lehet, h jobb lenne mindegyik fgv.-t így deklarálnom.

másrészt szívesen utánanéznék ennek a prototype keretrendszernek is, ha ezzel egyszerűbbé tehetem a programot.
viszont csak Wikipedián találtam róla egy kis leírást. Tudtok adni egy linket, ahol utánanézhetek, hogy mi is ez?

Köszi
12

Ihun-e

janoszen · 2010. Május. 24. (H), 15.13
Ihun-e van a hivatalos oldal: http://www.prototypejs.org/
14

Itt meg egy 5 részes sorozat

rrd · 2010. Május. 25. (K), 13.47
Itt meg egy 5 részes sorozat magyarul: http://webmania.cc/tag/prototype/
13

köszi

Totti 1986 · 2010. Május. 24. (H), 18.05
köszi, meg fogom nézni, és köszi az előző segítséget is