
Javasceipr - Oprava volání funkce s parametry
Našel jsem takovou funkci, která by měla vracet získaný údaj z url
function getVar(url, callback) {
var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) callback(xhr.responseText);
};
xhr.open('GET', url);
xhr.send();
}
Tady ale dělám něco zle, jelikož se mi nedaří naplnit proměnnou status
var status = getVar('soubor.php', return){};
Poradí někdo ? Díky
jsi si jisty, ze return je funkce pouzitelna jako callback? Ja bych spis cekal, ze volani bude ve stylu
Tak nevím jak jsi to myslel.. když to udělám podle tvé rady, data v proměnné status nemám...
Ono to ziskani dat asi nejakou dobu trva a ta funkce se vrati hned a na vysledek neceka, takze to bude chtit nejak takhle:
(javasceipr neznam, takze je to jen pseudokod - sleep je cokoli - proste jen marnime cas, nez ziskame data - taky mezitim muzeme delat neco jineho uzitecneho, pokud zrovna mame co)
Tak jsem to nahradil neexistující funkci sleep() za funkci setTimeout() ale nějak se to zacyklí a nevím proč...
Jdeš na to špatně. Pokud potřebuješ něco provést až se provede ten request, tak bys to měl provádět v callbacku a nečekat na to tímhle způsobem.
Tak že takto je to správně ? V této funkci ?
Ne.
Hm, a kam mam dát to while ?
Nikam. To tam nemá co dělat.
Aha, no ale to jsem zase na úplném začátku
Tak co je špatně ?
JS
html pro spustění js
Callback je ta mojeFce.
Tak že jestli to dobře chápu, proměnnou "status" mimo callback nedostanu, je to tak ?
Dostaneš. Ale až v okamžiku, kdy se request dokončí. A to dopředu nedokážeš říct, kdy bude.
Ale on není žádný zásadní důvod, proč ho používat mimo.
Jeste jednou, jak to cele funguje:
ty zavolas getVar('soubor.php',mojeFce); a to udela nejakou magii a v podstate se hned vrati a muzes delat neco jineho.
mezitim, na pozadi, v jinem vlaknu si getVar zije vlastnim zivotem, stahuje cosi odkudsi a po nejake blize nedefinovane chvili, dane take sviznosti internetu a milionem jinych veci, si ta getVar najednou usmysli a zavola mojeFce(status). Ta mojeFce si se statusem muze udelat co se ji zlibi - bud ho rovnou zpracovat na neco smysluplneho a skoncit, nebo ho nekam ulozit, kde si ho vezme nekdo jiny a skoncit.
Pokud s tim statusem nemas zadne okamzite umysly, tak je dobre ho plne zpracovat a vytezit v te funkci mojeFce.
Pokud mas naopak vsechno hotovo a nemuzes pokracovat, dokud nedostanes ten status, tak nechas mojeFce at ho ulozi a oznami ti to a potom uz ho mas a muzes s nim neco delat.
Pokud je to ten druhy pripad, tak ti nezbyva, nez po spusteni getVar jit do nejake formy cekani, dokud mojeFce nenastavi ten status.
Proto jsem ten while mel MIMO mojeFce za spustenim getVar
ten sleep() v mojem prikladu muze byt cokoli, co je systakticky pripustne (v pythonu bych napsal pass, v BASICu LET I=I, nebo cokoli jineho, "co nic nedela")
Samozrejme tim prichazis o vyhody paralelniho zpracovani, protoze ho prevedes umele na seriove. Ale to je asi to, co ty chces.
Zkus ten muj priklad jeste jednou, v tehle forme:
schvalne, co to udela :)
Teoreticky je to funkční, ale tohle v JS nejde. JS je v zásadě jednovláknový (kromě asynchronních volání) a čekání na odpověď zablokuje vlákno, takže už se ani nemůže provést ten callback.
aha, takze tam misto nic=1 musi byt nejaky ten sleep(), sleep(1), sleep(1000), sleep(100ms) nebo tak neco co se na kratkou chvili vzda procesoru, akorat nevim, jak se v JS pise a nemam cas to zrovna ted hledat a zkouset - poradis?
To právě JS nemá.
A co jQuery ? Ten to umí ?
jQuery je taky jenom JavaScript.
A jak to mám teda udělat když to JS neumí ?
Se dívám, že JS toho neumí víc, například neumí ani vytvořit primitivní pole (klíč->hodnota) tak to je už moc... a v tom někdo dělá ?
Vždyť už jsem ti psal několikrát, jak to máš udělat. Ale ty to s chutí ignoruješ.
V JS je i objekt svým způsobem pole, takže:
Jejda a kde ? To jdu znova celé přelouskat.
V objektu zase nevytvořím tohle
přece nemůžu volat person.254 abych získal hodnotu "50"..
Ale můžeš zavolat:
Tak jsem trochu zagooglil a koukam, ze moje instinktivni nechut se venovat javascriptu ma asi mnohem realnejsi podklad, nez jsem si myslel. (blici smailik)
A to proti jazykum obvykle predsudky nemivam ...
JS se dá vyčítat spousta věcí, ale zrovna tohle moc ne. Stačí pochopit, jak se používají callbacky a většina problémů je vyřešena. Horší je, když se callbacky začínají příliš zanořovat, ale naštěstí existují Promisy, které to víceméně řeší.
A konečný verdikt zní ?
Verdikt čeho?
Jak z te funkce getVar dostat vysledek pouzitelny v dalsim kodu asi.
Nevim. Pokud toho dalsiho kodu neni moc, tak ho asi narvat do te mojeFce cely :(
A pokud je toho kódu víc, tak ho prostě dáš do další funkce. Používat funkce není zakázané.
Jen mi to prijde jako drbani se levou nohou za pravym uchem, uvazim-li, jak dlouho tu JS je a ze IMHO neni zamyslen jako obskurnost typu Whitespace tutorial.html, Ook! ook.html ci Brainfuck bf
Tak si počkej na ES7, kde se bude dát použít async/await.