AuthorPepa

TypeScript: async funkce s interface

A takhle by mohla vypadat vaše async funkce pracující se složitějšími datovými strukturami realizovanými pomocí interfaces:

Async/await nebo callback? Oboje!

Pokud chcete nabídnout svoji funkcionalitu skutečně širokému obecenstvu, pak byste je asi neměli nutit do vámi vybraného modele použití formou callbacku, nebo promises, ale nabídněte hned obě.

Nic složitého. Stačí nabídnout interface funkce, kde budete detekovat její parametry a podle nich, respektive volání s nimi, zjistíte jak daný konzument vaší funkcionality hodlá použít a podle toho vyberete implementaci samotné funkce:

Samozřejmě lze napsat i kompaktněji:

Syndrom mrtvého koně

…Syndrom mrtvého koně je jistý druh slepoty, která může postihnout stejně tak webdesignera jako vrcholového manažera.

Když zjistíš, že jedeš na mrtvém koni, sesedni!

V reálném životě a zejména tom profesním, lidé volí i další strategie:

  1. říkáme: Vždyť ten kůň vždycky jezdil
  2. založíme pracovní skupinu pro analýzu koně
  3. zapřáhneme několik mrtvých koní k sobě, aby se jim společně lépe táhlo
  4. navštívíme jiná místa, abychom se podívali, jak se tam jezdí na mrtvých koních
  5. obstaráme si větší bič
  6. vyměníme jezdce
  7. zvýšíme standard kvality pro jízdu na mrtvém koni
  8. vytvoříme výbor pro oživení mrtvého koně
  9. vypracujeme srovnávací přehledy různě mrtvých koní
  10. upravíme kritéria, podle kterých se určuje, zda je kůň mrtvý
  11. zaplatíme externí specialisty, aby jezdili na mrtvém koni
  12. prohlásíme, že žádný kůň nemůže být natolik mrtvý, aby se na něm ještě nedalo jezdit
  13. vypracujeme studii, abychom zjistili, zda pro tento problém existují levnější poradci
  14. zakoupíme něco, po čem bude mrtvý kůň běžet rychleji
  15. nasedneme na svého starého slabého osla a zamaskujeme ho mrtvým koněm
  16. nařídíme přesčasy a nosíme mrtvého koně sami
  17. restrukturalizujeme stáj
  18. zdvojnásobíme příděly krmení
  19. prohlásíme, že mrtvý kůň byl už od samého počátku naším cílem
  20. povýšíme jezdce
  21. budeme zapírat, že jsme kdy nějakého koně vůbec měli
  22. sedneme si a budeme čekat, až se kůň sám zvedne
  23. dáme mrtvému koni řídíci funkci

A pak ještě tahle verze mrtvého koně… 🙂

JavaScript: proměnná jako klíč v objektu

Pokud byste chtěli v objektu nějak dynamicky generovat název klíče, pak takto:

TypeScript: typovost skrze interface a její rozšíření

Jednou z hezkých věcí v TypeScriptu je možnost definovat vlastní datové typy a to hned dvěmi způsoby: skrze type, nebo pomocí interface.

Čas od času se může stát, že potřebujte vámi definovaný typ rozšířit o nějkou vlastnost a nechcete kvůli tomu vytvářet další, nový datový typ. Pak se vám bude hodit konstrukce využívající operátor &, která přesně tohle dělá.

Hezké je, že můžete takto spojovat více již nadefinovaných typů, a spojovat můžete i více než 2 typy, ale můžete rozšířit daný typ jen o konkrétní požadované nové položky.

NodeJS: Threads, práce s vlákny

NodeJS je báječný, a to hlavně díky svému Async I/O. Dalším silným znakem je to, že NodeJS je Single Threaded Event Loop Architecture. Jednoduché, čitelné a výkoné paradigma pro webové aplikace stavějící na Request/Response modelu.

Na základě tětchto principů se NodeJS moc nehodi na takové věci, jako je Machine Learning, nebo Artificial Intelligence, jinými slovy, úlohy závislé na silné paralelizaci. Byť vzhledem k tom, že je samotný javascriptový engine napsaný v C++ a nabízí tak dost vysoký výkon.

Tedy až do teď! 🙂

Od verze 10.5.0 umí NodeJS pracovat s vlákny! Což z něj dělá prostředí vhodné i pro věci kolem strojového učení a umělé inteligence. Funkcionalitu vláken přináší modul worker_threads.

Modul je dostupný od verze 10.5.0 a jen v při spuštění s paramatrem
--experimental-worker, protože se zatím jedná o novinku.

Příklad spuštění javascriptového kódu v několika, v tomto případě ve 2 vláknech.

Z příkladu je jasné, že v procesu potomka můžete spouštět jakýkoliv javascriptový kód, sdílet s rodičovským procesem proměnné (paměť) a také posílat si navzájem zprávy. Vše, co byste po vícevláknových aplikací požadovali.

Dokumentace modulu worker_threads.

Kvalita dokumentace…

Nádherná ukázka toho, jak i rádoby dokumentace může být špatná…

Screenshot jsem pořídil ze stránek w3schools.com 🙂 Vím, že tohle není oficiální dokumentace, ale znám spoustu lidí, co odtud čerpají a berou informace odsud za ty jedině správné…

23 javascriptových návrhových vzorů

Proč návrhové vzory?

Abyste nemuseli vynalézat kolo.
Aby to co napíšte mělo hlavu a patu a rozuměli tomu i ostatní.

Pěkný článek popisující javascriptové návrhové vzory. Jednoduše a pochopitelně.

this v arrow functions

Tohle jsem viděl nesčetněkrát. Tohle vám skutečně fungovat nebude 🙂

Arrow functions jsou super, ale je dobré vědět jak fungují… Respektive vědět minimálné to, že nemají this, mino jiné, a proto se neprovede this.num++ nad num definovaném v objektu a, jak by se na první pohled mohlo zdát. this ukazuje na parent, tedy v tomto případě global, kde žádný num není 🙂

Správně tedy

Pěkný článek popisující detailně chování this kdekoliv v JS.

ES moduly v NodeJS

Modularita, co by nezbytná vlastnost jakéhokoliv programovacího jazyka pro psaní velkých aplikací, je v NodeJS zajištěna pomocí funkce require. Samotnou fyzcickou definici a implementaci pak zajišťuje CommonJS.

Takže takto v NodeJS

JavaScript a import

JavaScript, skrze svou specifikaci ECMAScript 2015 zavádí, mimo jiné, i nové klíčové slova import a export pro možnost modularizovat javasxriptový kód.
To dovoluje následující zápis kódu:

Tohle vám bude například fungovat, pokud píšete React, VueJS, nebo Typescript aplikaci, protože ta je teprve skrze nějaký transpiler kompilována do požadované verze JavaScriptu.

Nicméně v NodeJS import nefunguje… Zatím 🙂

node –experimental-modules

A tady přichází na scénu parametr příkazového řádku --experimental-modules, který vám umožní v NodeJS používat klíčové slovo import místo require. Přesně tak, jak byste jej použili v Reactí apce…
Opravdu píšu místo, protože obě možnosti zatím nejdou kombinovat.
Takže pokud spustíte NodeJS script s tímto parametrem, můžete použít novou syntaxi pro importování, ale samozřejmě i exportování na úrovni modulu:

Dalším rozdílem je samotná přípona souboru se zdrojákem. Původní require funguje v klasických .js souborech, nově import pak v souborech s příponou .mjs.
Samozřejmě můžete import přímo psát do.js souboru a spouštět pokaždé s potřebným parametren, ale je to proti zavedené konvenci a navíc, nejde na první pohlef vidět jaký způsob práce s moduly jste použili.

Moje doporučení?

Pište v TypeScriptu 🙂 budete moct v .ts souborech použít obě konstrukce pro import, ale vedle toho mnohem víc věcí, které JavaScript dělají skutečně silným programovacím jazykem.

© 2018 pepa.holla.cz

Theme by Anders NorénUp ↑