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.
function logout() {
	show_over_msg('logout', 'info');
	// call player_update setting logout var
	player_update('&logout=1');
	// call start
	start();
}

function player_update(update_string) {
	xmlhttp = GetXmlHttpObject();
	if(xmlhttp == null) {
		alert ('Browser does not support HTTP Request');
		return;
	}
	nocache = Math.random();
	var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;
	xmlhttp.open('GET',url,true);
	xmlhttp.send(null);
}

function start() {
	// ez eleg hosszu nem masolom be, ez allitja be a kezdoadatokat
	hide_over_msg();
}

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
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:

function player_update(update_string, after_call_func) {
	xmlhttp = GetXmlHttpObject();
	if(xmlhttp == null) {
		alert ('Browser does not support HTTP Request');
		return;
	}
	nocache = Math.random();
	var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;
	xmlhttp.onreadystatechange = function() {
		if(xmlhttp.readyState == 4) {
			after_call_func;
		}
	}
	xmlhttp.open('GET',url,true);
	xmlhttp.send(null);
}
É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?

function player_update(update_string, after_call_func) {
	xmlhttp = GetXmlHttpObject();
	if(xmlhttp == null) {
		alert ('Browser does not support HTTP Request');
		return;
	}
	nocache = Math.random();
	var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;
	xmlhttp.onreadystatechange = function() {
		if(xmlhttp.readyState == 4) {
			if(after_call_func != '') {
				after_call_func();
			}
		}
	}
	xmlhttp.open('GET',url,true);
	xmlhttp.send(null);
}
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

function logout() {
	// ...
	player_update('&logout=1','start');
}

function you_won() {
	// ...
	player_update('&won=1','show_rooms');
}


function start() {
	// ...
	// beallitja a kezdoertekeket
}

function show_rooms() {
	// ...
	// visszater a szobak listajahoz
}

function player_update(update_string, then_call_func) {
	xmlhttp = GetXmlHttpObject();
	if(xmlhttp == null) {
		alert ('Browser does not support HTTP Request');
		return;
	}
	nocache = Math.random();
	var url = 'player_update.php?player_id=' + overall_vars['player_id'] + '&player_type=' + overall_vars['player_type'] + '&nocache=' + nocache + update_string;
	xmlhttp.onreadystatechange = function() {
		if(xmlhttp.readyState == 4) {
			if(then_call_func != '') {
				then_call_func();
			}
		}
	}
	xmlhttp.open('GET',url,true);
	xmlhttp.send(null);
}
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