Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem JavaScript - Návržení kódu

Ahoj, poradí někdo, jak napsat lépe takový kód ? Děkuji

var i;
i = 0;

function start(){
      if (i === 0) a();
 else if (i === 1) b();
 else if (i === 2) c();
 else if (i === 3) d();
 else if (i === 4) e();
 else if (i === 5) return; //ukonceni funkce
 setInterval(start, 1000);
}

function a() { i = 1; /*..*/}
function b() { i = 2; /*..*/}
function c() { i = 3; /*..*/}
function d() { i = 4; /*..*/}
function e() { i = 5; /*..*/}

start();
Předmět Autor Datum
js_switch.asp
ws79 06.12.2015 16:46
ws79
A co tím jako získám ?
Honza Marek 06.12.2015 17:37
Honza Marek
function start() { functions[i++](); if (i < functions.length) setTimeout(start, 1000); } function a…
Wikan 06.12.2015 18:07
Wikan
Ahoj, díky.. tak to tak právě nejde, ten kód byl jen pro představu, zase jsem to napal blbě, myslel…
Honza Marek 06.12.2015 18:22
Honza Marek
V tom případě je prostě stačí spustit jednu po druhé, ne?
Wikan 06.12.2015 18:32
Wikan
Asi nerozumím, přece JS nečeká až se funkce celá provede, ne ?
Honza Marek 06.12.2015 20:01
Honza Marek
Čeká. Nečeká se pouze na dokončení asynchronních volání.
Wikan 06.12.2015 20:22
Wikan
A existuje nějaký 100% způsob jak to zjistím ?
Honza Marek 06.12.2015 20:59
Honza Marek
A čo chceš akože zisťovať? Po dokončení funkcie si vypíš napr. echo - "skončil som"...
pme 06.12.2015 21:02
pme
No jak zjistím, které funkce se volají asynchronně a na které se bude opravdu čekat...
Honza Marek 06.12.2015 21:10
Honza Marek
Musíš si napísať asynchronny javascript... Z Tvojho kódu sa žiadna funkcia nevolá asynchronne. Dopor…
pme 06.12.2015 21:20
pme
Pokud ta funkce neobsahuje callback, tak si můžeš být jistý, že není asynchronní.
Wikan 06.12.2015 21:49
Wikan
To jsem si myslel, ale asi to není pravda... Tu class co jsi mi tady napsal (pár dnů zpět) callback…
Honza Marek 06.12.2015 21:55
Honza Marek
To se teda čeká. Uvnitř ní se ale používá setTimeout, na jejíž výsledek se nečeká, ale ta má zase ca…
Wikan 06.12.2015 22:11
Wikan
Tak že pokud vnořím 10 funkcí do sebe a některá z nich bude obsahovat systémovou funkci s callbackem…
Honza Marek 06.12.2015 22:37
Honza Marek
Co by se mělo rušit? Nic se neruší. A JS neposkytuje jinou možnost jak psát asynchronní kód než s po…
Wikan 07.12.2015 08:08
Wikan
Myslím, že to, čo hľadáš, sú promisy. V tomto prípade by to mohlo vyzerať napr. takto: Promise.reso… poslední
los 07.12.2015 23:24
los
function start() {
  functions[i++]();
  if (i < functions.length) setTimeout(start, 1000);
}

function a() {/*..*/}
function b() {/*..*/}
function c() {/*..*/}
function d() {/*..*/}
function e() {/*..*/}

var functions = [a, b, c, d, e];
var i = 0;

start();

Ahoj, díky.. tak to tak právě nejde, ten kód byl jen pro představu, zase jsem to napal blbě, myslel jsem, že to z toho bude znatelné :-( OMLUVA!
Každá funkce a,b,c,d a e potřebuje svůj čas k provedení, některá trvá i 15sec. proto jsem uvnitř těch funkcí nastavoval tu var i abych dal funkci start() na vědomí, že se funkce dokončila a že může spustit další. Ale hledám nějaké lepší řešení..

Myslím, že to, čo hľadáš, sú promisy. V tomto prípade by to mohlo vyzerať napr. takto:

Promise.resolve(a())
	.then(b)
	.then(c)
	.then(d)
	.then(e);

Prípadne príklad so sekundovými odostupmi volaní s použitím zápisu lambda funkcie pomocou šípky (ES6):

var delay = t => new Promise(resolve => setTimeout(resolve, t));
Promise.resolve(a())
	.then(x => delay(1000))
	.then(x => b())
	.then(x => delay(1000))
	.then(x => c())
	.then(x => delay(1000))
	.then(x => d())
	.then(x => delay(1000))
	.then(x => e());

Ak chceš použiť funkcionalitu z ES6 v starších prehliadačoch, môžeš použiť kompilátor ako napr. Babel alebo TypeScript. Pre prehliadače, ktoré neimplementujú Promise, môžeš použiť knižnicu, napr. bluebird.

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