Autor Zpráva
JardaB
Profil
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
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
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
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
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
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
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
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.

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: