Autor | Zpráva | ||
---|---|---|---|
ReVolt Profil |
Ahoj, potřeboval bych radu jak vrátit javascriptem bool hodnotu po provedení php skriptu
někde jsem četl, že se na vrácení hodnoty z ajaxu můžu požít callback, ale nevidí způsob jak, s callback funkcemi jsem zatím moc nepracoval tak budu rád za každou radu je vůbec možné vrátit hodnotu, když je ajax asynchronní? díky |
||
Radek9 Profil |
#2 · Zasláno: 29. 7. 2013, 15:54:05
ReVolt:
„je vůbec možné vrátit hodnotu, když je ajax asynchronní?“ Není. Potřebný kód, který s návratovou hodnotou pracuje, dej do callback metody. |
||
Chamurappi Profil |
Reaguji na ReVolta:
„s callback funkcemi jsem zatím moc nepracoval“ S událostmi v DOMu jsi nepracoval? Nikdy jsi nevykonával funkce při onclick u? Nenastavoval jsi spuštění něčeho po uplynutí zadaného času? V tomto není rozdíl, onreadystatechange je také jen událost.
|
||
ReVolt Profil |
#4 · Zasláno: 29. 7. 2013, 16:01:23 · Upravil/a: ReVolt
Radek9:
ok, já jsem si to myslel, ale je možné vrátit hodnotu pomocí callbacku Chamurappi: jasně, ale nějak mi nejde do hlavy jak vycucnou hodnotu z ajaxu abych ji mohl vrátit |
||
Chamurappi Profil |
#5 · Zasláno: 29. 7. 2013, 16:37:19
Reaguji na ReVolta:
„hlavy jak vycucnou“ Brčkem. „abych ji mohl vrátit“ Dávají ti smysl následující funkce? function blbost1() { var x = 42; document.body.onclick = function() { x = 47; }; return x; } function blbost2() { var y = 42; setTimeout(function() { y = 47; }, 15000); return y; } blbost1() nebo blbost2() , měl bych snad někdy dostat hodnotu 47 ? Ne. Je to nesmyslná konstrukce, protože se funkce měnící hodnoty x a y volají jindy — jednu vyvolává uživatel, druhou sám prohlížeč po uplynutí určené doby.
Variací na obě blbosti je tato funkce: function blbost3() { var z = 42; var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xhr.open("GET", "blbost", true); xhr.onreadystatechange = function() { if(xhr.readyState == 4) z = 47; }; xhr.send(""); return z; } blbost3() , nikdy nedostanu hodnotu 47 , protože se funkce měnící hodnotu z volá jindy — vyvolává ji XMLHttpRequest po obdržení odpovědi od serveru (dalo by se říct, že ji vyvolává server). Pravděpodobně je trochu matoucí, že z pohledu běžného smrtelníka odpovídá server většinou dost rychle. Ale technicky vzato na délce prodlevy nezáleží, důležité je, že tam nějaká je a běh skriptu se nepozastavuje do doby, než se doprodlí. Do funkce blbost2 si také můžeš dát místo 15 sekund do setTimeout u 4 milisekundy a na výsledku to nic nezmění.
|
||
ReVolt Profil |
#6 · Zasláno: 29. 7. 2013, 16:50:00
samozřejmě, ale to je znak asynchronnosti, mě jen zajímalo zda existuje způsob jak dosáhnout vrácení hodnoty až po dokončení běhu php skriptu na serveru
a kdybych to nechal běžet synchronně tak to jaksi postrádá smysl používat ajax, díky, že jsi mi pomohl, díval jsem se na problém příliš konkrétně a opomněl jsem věci okolo ;) |
||
Radek9 Profil |
ReVolt:
„jak dosáhnout vrácení hodnoty až po dokončení běhu“ „kdybych to nechal běžet synchronně tak to jaksi postrádá smysl používat ajax“ No, v tom případě bys nepoužil AJAX, ale SJAX. :-) Pokud to chceš udělat asynchronně a hezky, podívej se na promise pattern. ;-) |
||
ReVolt Profil |
#8 · Zasláno: 29. 7. 2013, 17:56:20
Radek9:
xD přesně SJAX, díky za tip |
||
Radek9 Profil |
#9 · Zasláno: 29. 7. 2013, 18:12:31
ReVolt:
Ten SJAX hlavně nepoužívej, to bylo jen tak pro zajímavost. Ve chvíli načítání to prostě sekne prohlížeč, dokud se to celé nenačte. |
||
_es Profil |
ReVolt:
„zda existuje způsob jak dosáhnout vrácení hodnoty až po dokončení běhu php skriptu na serveru“ Na prácu s hodnotami vrátenými zo servera slúži udalosť onreadystatechange . Prečo stále píšeš o nejakom inom špeciálnom „vrátení hodnoty“? To je taký problém do vlastnosti onreadystatechange priradiť funkciu, ktorá na vrátené hodnoty ľubovoľne zareaguje?
Asi máš rovnaký problém v pochopení základných vecí ako „kolega“ v Využití proměné ve funkci (+ debata o sychronním AJAXu). |
||
ReVolt Profil |
_es:
díky za tvůj příspěvek, možná jsi nepochopil o co mi šlo (než jsem si uvědomil kontext ;)), do onreadystatechange můžu vložit třeba milion funkci, které budou reagovat na vstup vrácený ze serveru, ale nijak mi to nepomůže vrátit jakoukoli hodnotu z funkce, kde provádím http request, ven, jak psal Chamurappi, vzhledem k časové prodlevě to není proveditelné, když si např. vezmeš obecnou implementaci ajaxové fce. která bude vracet hodnotu např. pro zastavení odesílání formuláře (jakéhokoli) nebo odstřihnutí odkazu tak nevidím způsob jak takovou situaci ošetřit funkcí v onreadystatechange, možná jen nemám s javascriptem dost zkušeností, ale i tak si nemyslím, že by to šlo, pokud to jde a víš jak na to tak by bylo skvělé kdyby jsi to sem napsal (byl bych ti za to vděčný :)) |
||
_es Profil |
#12 · Zasláno: 31. 7. 2013, 09:37:19
ReVolt:
„nijak mi to nepomůže vrátit jakoukoli hodnotu z funkce, kde provádím http request“ Ale ty predsa z tej funkcie nič vrátiť nepotrebuješ, rozmyslíš si, čo má skript robiť a navrhneš jeho „logiku“ tak, aby to robil. Nič, čo si popísal, nie je problém spraviť „normálnym“ použitím objektu XMLHttpRequest. „pro zastavení odesílání formuláře“„nebo odstřihnutí odkazu“ Akého formulára? Formuláre aj odkazy sú niečo iné. Zastaviť odoslanie dát z objektu XMLHttpRequest ?
Tak navrhneš „logiku“ tak, aby boli kontroly pred samotným odoslaním a podľa ich výsledku boli dáta buď odoslané alebo neodoslané. Alebo prerušiť už vykonaný dotaz, no ešte pred prijatím odpovede servera? Na to je metóda abort (developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#abort%28%29).
|
||
Chamurappi Profil |
#13 · Zasláno: 31. 7. 2013, 12:31:01
Reaguji na ReVolta:
„např. pro zastavení odesílání formuláře (jakéhokoli) nebo odstřihnutí odkazu tak nevidím způsob jak takovou situaci ošetřit funkcí v onreadystatechange“ Standardní chování chceš v takové situaci zrušit vždy. Tedy v onsubmit u/onclick u vrátíš false . Po přijetí odpovědi ze serveru musíš případné odeslání či prokliknutí odkazu znovu skriptem vyvolat.
|
||
Časová prodleva: 11 let
|
0