Autor Zpráva
quatzael
Profil
Jak lze prosím volat funkci (nebo spíše další příkazy) až po tom co se dokončí předchozí funkce??
Potřebuju to co umí jQuery v parametru callback function, ale bez jQuery, přímo v javascriptu.
FilipProgramator
Profil *
var asynchronniFunkce = function (callback) {
 
    // Je callback funkce?
    if (typeof callback === "function") {
        callback(vysledek);
    }else {
      // reakce na chybu
    }

};

Zdroj: Javascript patterns
quatzael
Profil
FilipProgramator:
Asi to uplně nechápu.. Jak by to bylo, kdyby se měla nejdřív vykonat předem definovaná funkce s názvem např. funkce_one a potom nepředdefinovaná funkce:

function{prikaz1; prikaz2;}

??
Someone
Profil
JavaScript defaultně provádí funkce synchronně, nerozumím tomu, čeho se snažíš dosáhnout.
funkceJedna();
funkceDva();

nejdřív se provede první a pak druhá.

Možná máš na mysli něco takového:

function mojeFunkce(data,callback) {

    data = data + ' Pepo';
    callback(data);

}

mojeFunkce("čau",function(data){
    alert(data); // vyskočí alert "čau Pepo"
});

mojeFunkce("ahoj",function(data){
    document.write(data); // vypíše se "Ahoj Pepo"
});
FilipProgramator
Profil *
Předpokládám, že asynchronniFunkce bude vyvolána asynchronně. Tedy z nějakého timeru, nebo eventu. Potom je callback skutečně nutný, jinak ne. Jak Someone říká, nejdříve se provede funkce na prvním řádku a pak na druhém. Pokud chceš aby se provedli najednou, je třeba aby tu druhou funkci zavolalo něco jiného.

setTimeout(function(){ asynchronniFunkce(callback) }, 10); // vyvola se za 10ms
synchronniFunkce(); // nebude cekat na dokonceni asynchronniFunkce a bude vykonavat dal

Ale asi to není úplně nejlepší způsob + netestoval jsem.

zdroj: W3 schools
quatzael
Profil
Someone:
JavaScript defaultně provádí funkce synchronně, nerozumím tomu, čeho se snažíš dosáhnout.
Potřebuju, aby se druhá funkce provedla až potom co se zcela dokončí ta první.
juriad
Profil
Nejprve si ujasni to, že funkce je jen další datový typ, stejně jako číslo ji můžeš předat jiným funkcím. Podobně jako čísla mají operátor + pro sčítání, tak funkce mají operátor () závorky pro jejich zavolání.
Zároveň zápis
function secti(a,b) {return a+b;}
je ten zkratka za
secti = function(a,b) {return a+b;}

Ty tedy můžeš klidně funkci
function reduce(pole, funkce) {
  var vysledek = pole[0];
  for(int i = 1; i < pole.length; i++) {
    vysledek = funkce(vysledek, pole[i]);
  }
  return vysledek;
}
předat funkci secti:
reduce([1,2,3,4], secti) // 10
a to je to samé jako:
reduce([1,2,3,4], function(a,b) {return a+b;})

schválně, co se stane pokud funkce bude:
a) function(a,b) {return a*b;}
b) function(a,b) {return a;}
c) function(a,b) {return b;}

Pokud chceš na konci běhu funkce vykonat ještě něco, přičemž to něco se liší, můžeš použít následující:
function mojeFunkce(a,b, dalsiFunkce) {
  // nejaky vypocet s promennymi a, b
  var vysledek = a+b;
  dalsiFunkce(vysledek);
}

Někdy předáváš řízení prohlížeči a jediný způsob, jak se dozvědět výsledek, je dodat mu funkci, kterou má zavolat až nastane příslušná událost. Tak fungují veškeré obsluhy událostí, setTimeout, AJAX a další.
quatzael
Profil
V té první fukci je AJAX a ta druhá funkce dělá to, že nastaví správnou hodnotu v selectboxu, který je vyplněn hodnotami z té první funkce..
Someone
Profil
quatzael:
Potřebuju, aby se druhá funkce provedla až potom co se zcela dokončí ta první.
Jak jsme již uváděl v [#4]..
mojeFunkce(); // nejdřív se provede tahle
mojeDruhaFunkce(); // a až potom co se zcela dokončí první, se provede tahle

v čem je problém?
quatzael
Profil
Someone:
JavaScript defaultně provádí funkce synchronně, nerozumím tomu, čeho se snažíš dosáhnout.

Tady uvádí něco jiného:
JavaScript statements are executed line by line. However, with effects, the next line of code can be run even though the effect is not finished. This can create errors.

Je to tedy tolik kritizovaný w3schools.com, ale myslím, že tohle tam mají správně.. aspoň takhle fungují veškeré animace v javascriptu..
Someone
Profil
quatzael:
V té první fukci je AJAX
V tom případě musíš tu funkci volat až se vrátí odpověď ze serveru. Třeba ji předej jako parametr té funkce viz. [#4].
juriad
Profil
Druhou funkci, která nastavuje správnou hodnotu v selectboxu přesuň do AJAX callbacku po kódu, který selectbox vyplňuje hodnotami.
quatzael
Profil
juriad:
Jo, teď jsem to zkusil udělat tak, že jsem tu druhou funkci dal přímo do tý první. Teď to konečně funguje. Akorát tu první funkci tam musím udělat dvakrát, protože v jiných částech jí potřebuju mít bez tý druhý funkce..
Díky.
juriad
Profil
Tak té první funkci přidej parametr dalsiFunkce, tak jako to uvadim vyse. +rozšíření [#2] FilipProgramator.
prvniFunce(data, dalsiFunce) {
  // vypln hodnotami selectbox podle promenne data z AJAXu
  if (typeof dalsiFunkce === "function") {
    dalsiFunkce();
  }
}

A jednou budeš volat první funkci:
prvniFunkce(data, druhaFunkce);
a ve zbylých případech:
prvniFunkce(data, undefined);
quatzael
Profil
juriad:
Ale to mi taky nepomůže. Teď jsem zjistil, že mi to fungovalo jen proto, že jsem tam měl ještě před tou druhou funkcí příkaz window.alert();, který jsem si tam dal pro kontrolu.. window.alert ten script zastaví a zbytek se vykoná až potom co kliknu na ok. Ale bez toho se to pořád nestíhá dokončit to z tý první funkce. Konkrétně přidat do elementu <select> další elementy <option>, ze kterých má ta druhá funkce vybrat jeden podle jeho value..
juriad
Profil
Volání té druhé funkce musíš umístit do zpracování AJAXu.
Možná by nebylo od věci ukázat svůj kód.
Chamurappi
Profil
Reaguji na quatzaela:
However, with effects, the next line of code can be run even though the effect is not finished.
Potřebuješ rozumět tomu, jak animace funguje. Přes události. Načasované. Stejně jako si třeba nastavíš funkci do onclicku, tak funkce v jQuery na nastartování animace nastaví událost, která se má odehrát, jakmile uplyne 13 milisekund a 26 milisekund a 39 milisekund atd.

Je to tedy tolik kritizovaný w3schools.com, ale myslím, že tohle tam mají správně..
Je to docela zavádějící, „can be run“ místo „will be run“, navazující formulace s „prevent this“ je přímo lživá, protože callback funkcí nejde zabránit asynchronnosti prováděné akce.

Ale bez toho se to pořád nestíhá dokončit to z tý první funkce.
Máš to nějaké zamotané. Mohl bys znovu přesně popsat, čeho chceš dosáhnout, ideálně i s ukázkou nefunkčního kódu?


Reaguji na juriada:
Zároveň zápis“ … „je ten zkratka za
Ano, ovšem nejsou to úplné ekvivalenty. Liší se v tom, kdy se ta funkce v proměnné ocitne. Zatímco při klasické deklaraci je tam už vyplněná při spuštění bloku, při přiřazení se tam přiřadí až … při přiřazení :-)
quatzael
Profil
Chamurappi
Já Ti klidně pošlu odkaz na mý stránky na mail, když mi řekneš svou e-mail adresu, ale tady to opravdu dávat nemůžu..

Jde o formulář, kde je input pro zadání PSČ a pod ním je selectbox, do kterého moje AJAXová funkce vkládá elementy typu <option> s názvy konkrétních měst a jejich částí, které našla v databázi pod uvedeným PSČ. Ve formuláři mi to funguje normálně, protože se to načte dostatečně rychle na to, aby šlo okem zaregistrovat nějaký zpoždění.

Jenže když to chci, aby se ten formulář ukládal do sessionStorage, tak po načtení stránky a příslušných hodnot do formuláře nestihne ta první funkce dostatečně rychle vložit do elementu <select> ty <option> elementy s jejich hodnotami a tak druhá funkce nevybere uloženou hodnotu v selectboxu, protože tam ty <option> elementy prostě ještě nejsou..
Funguje to jen když před tu druhou funkci hodím window.alert, protože ta ten script zastaví..
preca1
Profil
Chamurappi:
Reaguji na juriada:
„Zároveň zápis“ … „je ten zkratka za“
Jen doplním, že anglicky se tomu řiká hoisting.

quatzael:
Na týhle diskusi neni zvykem něco někomu posílat na e-mail, je to veřejná diskuse. Nechceme celej tvůj kód. Dej sem jen onu problematickou část s nějakejma hloupejma datama.
quatzael
Profil
preca1:
Pozdě, už jsem Chamurappimu poslal zprávu s odkazem z těch jeho stránek. Kdo ví jestli to teda vůbec čte..
Myslím, že jsem to popsal celkem jasně v čem je problém. Ještě jednou. Jde o to, že potřebuju v selectboxu najít value, jenže ten příkaz který ji hledá se odehraje bezprostředně po funkci, která má ty <optiony> v selectboxu vygenerovat.. A než je vygeneruje tak tak ta druhá část (druhá funkce) hledá hodnoty, které tam ještě nejsou..

Tady je teda kód:
function getpscstore(pscvalue)
 {

if (pscvalue.length==6)
  {
var pscvaluea = pscvalue.substring(0,3); 
var pscvalueb = pscvalue.substring(4,6);   
var pscvaluecor = pscvaluea.concat(pscvalueb); 
   }

if (window.XMLHttpRequest)
   {// code for IE7+, Firefox, Chrome, Opera, Safari
   xmlhttp=new XMLHttpRequest();
   }
 else
   {// code for IE6, IE5
   xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  
   }
 xmlhttp.onreadystatechange=function()
   {
   if (xmlhttp.readyState==4 && xmlhttp.status==200)
     {

 var vraceno = eval('(' + xmlhttp.responseText + ')');
 
 $(".option-remove").remove();
 $("#form-pov-bydliste").append(vraceno['text']);
 
 if (pscvalue.length==6 && vraceno['alert'] == 1)
  {
  window.alert('Nesprávné PSČ');        
  }
    }
   }
 xmlhttp.open("GET","/php/pscdb.php?q="+pscvaluecor,true);
 xmlhttp.send();
 
 ////////////////////TADY ZAČÍNÁ ČAST, U KTERÝ POTŘEBUJU, ABY PROBĚHLA PO TOM CO SE DOKONČÍ TO PŘED TÍM////////////////
 
 if(typeof sessionStorage.bydliste_item !== "undefined")
   $("#form-pov-bydliste").val(sessionStorage._bydliste_item);

 }

Tady je v PHP to, co ten AJAX načítá ze serveru:

<?php

$q=$_GET["q"];

$co="jeto";
 

 if (!$db_con)
   {
   die('Could not connect: ' . mysql_error());
   }

mysqli_query($db_con, "SET NAMES 'utf8'");

$sql="SELECT DISTINCT cast_obce, obec FROM seznam_psc WHERE psc = '".$q."' ORDER BY obec, cast_obce";
 
$result = mysqli_query($db_con, $sql);
 
 $frow = mysqli_fetch_array($result);
 $id = 'id';
 $obecokres = 'obec_okres';
 $obec = 'obec';
 $castobce = 'cast_obce';
 $count = 0;
 $alert = 0;
 

 if (count($frow) == 0)  
 $text = '<option class=\"option-remove\">Vyplňte PSČ      </option>';
 else
 $text = '<option class=\"option-remove\">Vyberte</option>';
 
 $sql="SELECT DISTINCT cast_obce, obec FROM seznam_psc WHERE psc = '".$q."' ORDER BY obec, cast_obce";

$result = mysqli_query($db_con, $sql); 
 
 while ($row = mysqli_fetch_array($result))
 {

  $text = $text . '<option class=\"option-remove\" value=\"' . $row[$obec] . ' - ' . $row[$castobce] . '\">' . $row[$obec] . ' - '  . $row[$castobce] . '</option>';
 
 $count = 1;
  } 
   if ($count == 0)
   {
   $alert = 1;
   }

echo "{\"text\": \"" . $text . "\", \"alert\": \"" . $alert . "\"}";

mysql_close($db_con);

?>
juriad
Profil
jednoduše řádky 40-43 javascriptu přestěhuj za řádku 32 (tak aby se výběr hodnoty prováděl uvnitř ifu ve funkci onreadystatechange)
quatzael
Profil
juriad:
Supr!! Vypadá, že to opravdu funguje!! Dík moc!!
Chamurappi
Profil
Reaguji na quatzaela:
Pozdě, už jsem Chamurappimu poslal zprávu s odkazem z těch jeho stránek. Kdo ví jestli to teda vůbec čte..
Hm. Asi bych měl cestu k tomu formuláři víc zkomplikovat. Kdybych chtěl, aby mi lidi z diskuse psali, dám si tady do profilu veřejný e-mail.
Koukám, že pokud v tom tvém <select>u měním hodnotu šipkami na klávesnici, formulář se nepřestavuje.
quatzael
Profil
Chamurappi:
Kdybych chtěl, aby mi lidi z diskuse psali, dám si tady do profilu veřejný e-mail.
Chtěl si živou ukázku..

Koukám, že pokud v tom tvém <select>u měním hodnotu šipkami na klávesnici, formulář se nepřestavuje.
V jakým selectu?? Myslíš ten s tím bydlištěm?? Co se tam má "přestavovat"??
Chamurappi
Profil
Reaguji na quatzaela:
Chtěl si živou ukázku..
Přesně tak, nechtěl jsem si s tebou povídat soukromě.

V jakým selectu??
Ve všech. Pokud vyberu nějakou hodnotu myší, zbytek formuláře se tomu přizpůsobí. Pokud volbu měním klávesnicí, změně se nic nepřizpůsobuje.
Joker
Profil
quatzael:
Chtěl si živou ukázku..
Tím se myslí sem do diskuse.
Proč by měl bližší informace dostat jen jeden člověk a ostatní to řešit bez nich? Další krok pak je rovnou posílat celé dotazy mailem. Teda, ne že by to někteří nedělali. Ale rovnou říkám, že v mém případě reakce bývá ať to pošlou do diskuse.
Ohledně argumentů, že to nelze zveřejnit, viz Povídání o živých ukázkách.
quatzael
Profil
Chamurappi:
Přesně tak, nechtěl jsem si s tebou povídat soukromě.
Vždyť jsme si soukromě nepovídali. Já jsem Ti jen soukromě poslal ukázku, kterou jsem nechtěl sem dávat veřejně. A teď si povídáme zase veřejně.

Ve všech. Pokud vyberu nějakou hodnotu myší, zbytek formuláře se tomu přizpůsobí. Pokud volbu měním klávesnicí, změně se nic nepřizpůsobuje.
Pořád nevím co máš přesně na mysli s tím "přizůsobováním".. Jestli myslíš, že při některých hodnotách v selectboxech se mají automaticky skrývat některé jiné inputy, tak mě to funguje i když to dělám šipkama. Je pravda, že teď když jsem to v IE zkoušel v tom IE7 módu tak tam ten javascript jede jenom napůl, některý funkce to úplně ignoruje.. To budu muset ještě asi nějak vyřešit..
Co používáš za prohlížeč IE8?? V tom je to taky šíleně rozdrbaný.. Já používám IE9, Chrome a Mozillu a ve všech to jede bez problému..


Joker:
Odkaz na moje stránky sem dávat opravdu nechci, ale nevadí mi když to zdejším moderátorům pošlu mailem (pokud jim to teda nevadí)..
Normálně bych to dal do jsfiddle, ale tohle se týkalo AJAXU a databáze, takže by to moc jednoduše nasimulovat stejně nešlo..
Chamurappi
Profil
Reaguji na quatzaela:
když jsem to v IE zkoušel v tom IE7 módu tak tam ten javascript jede jenom napůl, některý funkce to úplně ignoruje
Za poslední položku v zápisu objektu nepatří čárka. Konkrétně třeba v pov-checkselectbox.js na řádku 276. Dál jsem to nezkoumal.

Co používáš za prohlížeč IE8??
Závadu pozoruji ve Firefoxu 15. Příčinu jsem nezkoumal.

když to zdejším moderátorům pošlu mailem (pokud jim to teda nevadí)
Vadí. Omezils tím počet lidí, kteří ti mohou poradit, na jednoho. Pokud nejsem součást altruistického davu diskutérů, není má asistence bezplatná.
quatzael
Profil
Chamurappi:
Za poslední položku v zápisu objektu nepatří čárka. Konkrétně třeba v pov-checkselectbox.js na řádku 276.
Díky. Ujelo mi to asi jak jsem tam přidával a umazával jednotlivý parametry..

Závadu pozoruji ve Firefoxu 15. Příčinu jsem nezkoumal.
Je pravda, že v mý verzi 20.0.1 taky zbytek formuláře nereaguje na přepínání hodnot v selectboxu pomocí šipek. Nicméně se to hned projeví po události .blur()..
Otázka je jestli se takhle Mozilla nechová běžně.. Ty máš jiný zkušenosti na jiných stránkách?

Vadí. Omezils tím počet lidí, kteří ti mohou poradit, na jednoho. Pokud nejsem součást altruistického davu diskutérů, není má asistence bezplatná.
Sorry.

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: