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
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 onclicku? 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
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
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;
}
Když zavolám 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;
}
Když zavolám 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 setTimeoutu 4 milisekundy a na výsledku to nic nezmění.
ReVolt
Profil
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
Radek9:
xD přesně SJAX, díky za tip
Radek9
Profil
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
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
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 onsubmitu/onclicku vrátíš false. Po přijetí odpovědi ze serveru musíš případné odeslání či prokliknutí odkazu znovu skriptem vyvolat.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: