Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
jsi si jisty, ze return je funkce pouzitelna jako callback? Ja bych spis cekal, ze volani bude ve st…
gilhad 30.10.2015 23:44
gilhad
Tak nevím jak jsi to myslel.. když to udělám podle tvé rady, data v proměnné status nemám... var st…
Honza Marek 31.10.2015 00:26
Honza Marek
Ono to ziskani dat asi nejakou dobu trva a ta funkce se vrati hned a na vysledek neceka, takze to bu…
gilhad 31.10.2015 10:22
gilhad
Tak jsem to nahradil neexistující funkci sleep() za funkci setTimeout() ale nějak se to zacyklí a ne…
Honza Marek 31.10.2015 11:06
Honza Marek
Jdeš na to špatně. Pokud potřebuješ něco provést až se provede ten request, tak bys to měl provádět…
Wikan 31.10.2015 11:09
Wikan
Tak že takto je to správně ? V této funkci ? function mojeFce(hodnota) { status = hodnota; data_rea…
Honza Marek 31.10.2015 11:23
Honza Marek
Ne. function mojeFce(status) { alert(status); } getVar('soubor.php', mojeFce);
Wikan 31.10.2015 11:31
Wikan
Hm, a kam mam dát to while ?
Honza Marek 31.10.2015 11:38
Honza Marek
Nikam. To tam nemá co dělat.
Wikan 31.10.2015 11:41
Wikan
Aha, no ale to jsem zase na úplném začátku :-( Tak co je špatně ? JS var status; function getVar(u…
Honza Marek 31.10.2015 11:55
Honza Marek
Jeste jednou, jak to cele funguje: ty zavolas getVar('soubor.php',mojeFce); a to udela nejakou magi…
gilhad 31.10.2015 12:17
gilhad
Teoreticky je to funkční, ale tohle v JS nejde. JS je v zásadě jednovláknový (kromě asynchronních vo…
Wikan 31.10.2015 12:20
Wikan
aha, takze tam misto nic=1 musi byt nejaky ten sleep(), sleep(1), sleep(1000), sleep(100ms) nebo tak…
gilhad 31.10.2015 12:25
gilhad
To právě JS nemá.
Wikan 31.10.2015 12:31
Wikan
Tak jsem trochu zagooglil a koukam, ze moje instinktivni nechut se venovat javascriptu ma asi mnohem…
gilhad 31.10.2015 16:18
gilhad
JS se dá vyčítat spousta věcí, ale zrovna tohle moc ne. Stačí pochopit, jak se používají callbacky a…
Wikan 31.10.2015 16:24
Wikan
A konečný verdikt zní ?
Honza Marek 31.10.2015 17:37
Honza Marek
Verdikt čeho?
Wikan 31.10.2015 17:46
Wikan
Jak z te funkce getVar dostat vysledek pouzitelny v dalsim kodu asi. Nevim. Pokud toho dalsiho kodu…
gilhad 31.10.2015 20:10
gilhad
A pokud je toho kódu víc, tak ho prostě dáš do další funkce. Používat funkce není zakázané.
Wikan 31.10.2015 20:11
Wikan
Jen mi to prijde jako drbani se levou nohou za pravym uchem, uvazim-li, jak dlouho tu JS je a ze IMH… nový
gilhad 31.10.2015 21:46
gilhad
Tak si počkej na ES7, kde se bude dát použít async/await. poslední
Wikan 01.11.2015 09:10
Wikan

jsi si jisty, ze return je funkce pouzitelna jako callback? Ja bych spis cekal, ze volani bude ve stylu

var status;
function mojeFce(hodnota) {
status = hodnota;
}

....

getVar('soubor.php',mojeFce);
print status ....

Tak nevím jak jsi to myslel.. když to udělám podle tvé rady, data v proměnné status nemám...

var status;
function mojeFce(hodnota) {
status = hodnota;
alert(status); // tady jsou data ze souboru soubor.php
}

getVar('soubor.php',mojeFce);
alert(status); // tady je undefined

Ono to ziskani dat asi nejakou dobu trva a ta funkce se vrati hned a na vysledek neceka, takze to bude chtit nejak takhle:

var status;
var data_ready;
data_ready=0;

function mojeFce(hodnota) {
status = hodnota;
data_ready=1;
alert(status); // tady jsou data ze souboru soubor.php
}

getVar('soubor.php',mojeFce);
while (data_ready==0) do sleep();
alert(status); // ted uz by tu data mela byt

(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)

getVar('soubor.php',mojeFce);
do_unrelated_stuff();
while (data_ready==0) do more_unrelated_stuff();
alert(status); // ted uz by tu data mela byt

Tak jsem to nahradil neexistující funkci sleep() za funkci setTimeout() ale nějak se to zacyklí a nevím proč...

getVar('soubor.php',mojeFce);

while (data_ready==0) {
  setTimeout(function(){},10);
}

alert(status); // ted uz by tu data mela byt

Tak že takto je to správně ? V této funkci ?

function mojeFce(hodnota) {
status = hodnota;
data_ready=1;
while (data_ready==0) {
setTimeout(function(){},10);
}
}

getVar('soubor.php',mojeFce);

alert(status); // ted uz by tu data mela byt

Aha, no ale to jsem zase na úplném začátku :-( Tak co je špatně ?

JS

var status;

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();
}

function mojeFce(status) {
    alert(status); // Tady data jsou
}

function zacni() {
  getVar('soubor.php',mojeFce);
  alert(status); // ########## Tady stále nic není a ta data potřebuji nadále s proměnnou pracovat ########## 


  setInterval(zacni, 5000);
}

html pro spustění js

<body onload="zacni();">

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:

var status;
var data_ready;
data_ready=0;
var nic;

function mojeFce(hodnota) {
status = hodnota;
data_ready=1;
}

getVar('soubor.php',mojeFce);

while (data_ready==0) { nic=1; };

alert(status); // ted uz by tu data mela byt

schvalne, co to udela :)

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?

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

Zpět do poradny Odpovědět na původní otázku Nahoru