Autor | Zpráva | ||
---|---|---|---|
JardaB Profil |
#1 · Zasláno: 23. 3. 2018, 13:30:00
Ahoj, poradí mi někdo zápis, jak mám z následujícího příkladu vrátit zpět vlastnost[1] a vlastnost[2], tak aby byly proměnné k dispoizici i na nejvyšší úrovni?
Takto, jak mám zapsáno jsou ty proměnné použitelné jen na úrovni jakékoliv funkce nebo v ní. Jinde hlásí undefined. var vlastnost = new Array(); function hodnoty(callback) { $.getJSON("scripts/vlastnost.php", {klient: IDKlient} , function(data){callback(data);}); } function vlastnost (result) { vlastnost [1] = Number(result.z1); vlastnost [2] = Number(result.z2); } hodnoty(vlastnost); |
||
Kajman Profil |
Myslíte, že ještě existuje pole vlastnost, když jste ji přepsal funkcí vlastnost? Asi stačí nepoužít stejný název.
|
||
JardaB Profil |
#3 · Zasláno: 23. 3. 2018, 14:39:19
Omlouvám se, je to samozřejmě špatně uvedeno. V kodu to mám samozřejmě jinak. Jen jsem to vypíchl a zle přepsal. Nicméně proměnné jsou mimo funkci undefined.
var vlastnost = new Array(); function hodnoty(callback) { $.getJSON("scripts/vlastnost.php", {klient: IDKlient} , function(data){callback(data);}); } function stav (result) { vlastnost [1] = Number(result.z1); vlastnost [2] = Number(result.z2); } hodnoty(stav); |
||
Radek9 Profil |
JardaB:
A ověřuješ je až po skončení toho requestu, nebo rovnou za voláním funkce hodnoty ? Ten request je asynchronní a ten callback se tedy nevolá hned. Pokud s těmi hodnotami chceš dál něco dělat, musíš dát příslušný kód do toho callbacku (funkce stav ).
|
||
JardaB Profil |
#5 · Zasláno: 23. 3. 2018, 15:09:47
Ano je mi jasné, že to je díky tomu callback, jenže jsem v tomhle začínající a chtěl jsem spíš požádat, aby to někdo upravil. Když uvidím zápis, spíše to pochopím.
|
||
Kajman Profil |
var vlastnost = new Array(); function hodnoty(callback) { $.getJSON("scripts/vlastnost.php", {klient: IDKlient} , function(data){callback(data);}); } function vypis() {window.alert(vlastnost [1]);} function stav (result) { vlastnost [1] = Number(result.z1); vlastnost [2] = Number(result.z2); //konecne data v poradku dosla, tak je muzu pouzivat vypis(); } hodnoty(stav); |
||
JardaB Profil |
#7 · Zasláno: 23. 3. 2018, 16:01:45
Omlouvám se, ale opravdu mi to nedochází. Když po zavolání funkce hodnoty(stav); chci použít vlastnost[1], tak je udnefined. Váš příklad jen vypíše hodnotu, což jsem uměl. Chci s ní ale dál pracovat mimo funkci.
tedy: hodnoty(stav); prepocet = vlastnost[1] * dalsi_hodnoty; |
||
Kajman Profil |
#8 · Zasláno: 23. 3. 2018, 16:15:03
Jde o ten čas, kdy s ní budete pracovat. Ten ajax požadavek dostane odpověď třeba až za sekundu nebo nikdy. Do té doby je přece jasné, že nebude nastavená. Ale díky asynchronnímu volání javascript pracuje na dalším kódu hned. Čas, kdy jsou data k dispozici je až ve chvíli, kdy se volá funkce stav. Potom už budou data dostupná i jinde.
|
||
JardaB Profil |
#9 · Zasláno: 23. 3. 2018, 16:25:24
Jo takhle to funguje. To co popisujete je logické, ale nenapadá mě, jak z toho ven. Tu funkci volám na začátku s požadavkem na vstupní data pro další výpočty. Musel bych všechny další výpočty zahrnout do funkce vypis();
|
||
Radek9 Profil |
#10 · Zasláno: 23. 3. 2018, 17:24:39
JardaB:
„Musel bych všechny další výpočty zahrnout do funkce vypis();“ Správně. Běžně se to dneska dělá přes asynchronní funkce, což je syntaktický cukr nad objekty typu Promise (což je objekt, který ti vrátí ta funkce getJSON , pokud jí nedáš callback). Kód se potom píše velice podobně jako synchronní kód:
var vlastnost = new Array(); function hodnoty(callback) { return $.getJSON("scripts/vlastnost.php", { klient: IDKlient }); } function stav(result) { vlastnost[1] = Number(result.z1); vlastnost[2] = Number(result.z2); } // Zde bude tvůj kód (async function () { var result = await hodnoty(); stav(result); console.log(vlastnost); })(); V novějších prohlížečích to bude fungovat takhle. Pokud chceš, aby to fungovalo i ve starších, budeš muset použít třeba Babel. Tady je živá ukázka s použitím nějakých dummy JSON dat. |
||
JardaB Profil |
#11 · Zasláno: 23. 3. 2018, 17:41:58
Moc děkuji za vysvětlení, zítra si vše otestuji. Určitě mi postačí, aby to makalo v novějších prohlížečích.
|
||
Časová prodleva: 6 let
|
0