Zpětná volání VS slibuje VS Async / Čekejte

Při procházení oznámenými řečníky pro tento týden setkání BerlinJS jsem si všiml, že Mohamed Oun předvede svůj vůbec první rozhovor (mimochodem hodně štěstí) o nejnovějším velkém hitu JS, Async a čeká. Takže jsem si myslel, že mohu udělat i své vlastní shrnutí, abych mohl porovnat poznámky;)

Teď v žádném případě nebudu s tímto blogem chodit na novou půdu, ale alespoň pro mě celá tato slibná a async / očekávaná věc nedávala smysl, dokud jsem ji skutečně nepoužila. A to uděláme.

Pro ty, kteří přicházejí z jiných jazyků, výhody, které slibují a async + čekají, představují čistý a čitelný způsob, jak propojit funkce, a implementovat spolehlivé a stručné řízení toku. Nic víc nic míň.

Ať už jdete pěšky, na kole nebo autobusem, stále se můžete dostat tam, kam chcete jet. Totéž platí pro funkční zpětná volání VS Promises.

Udělejme to → Nastavení

Představme si, že máme aplikaci node.js, která umí zaúčtovat data z formuláře, do řadiče, který prostřednictvím mongoose (včetně trochu middlewaru) ukládá do naší databáze.

Tento scénář nám ​​dává několik možností, dobře tři:

Zpětná volání

TLDR tohoto je v podstatě to, že pokud máte více funkcí, které je třeba vykonat v rámci našeho řadiče, JS, kvůli asynchronní povaze nebude čekat na dokončení funkce, než přejde na další. Jak to lidé začali obcházet, je použití zpětných volání, jak můžete vidět níže.

Nazýváme functionA a provádění jakýchkoli následných funkcí se stává závislým na návratu functionA.

Nyní se problém s tímto začíná objevovat, když máme složitější funkce. Možná budete potřebovat dezinfikovat svá data nebo spouštět validace, nebo si v DB vytvářet vazby s jinými záznamy. Rychle se dostanete k tomu, co mnozí nazývají peklem zpětného volání.

Začneme muset hnízdat zpětná volání a věci se rychle stávají obtížně čitelné.

Sliby

Promise je objekt představující případné dokončení nebo selhání asynchronní operace.

Tomuto vnořenému, obtížně čitelnému nepořádku se můžeme vyhnout a pomocí něčeho podobného dosáhnout stejného cíle.

Řekněme, že chceme před uložením najít další záznam a vytvořit asociaci, víme, jak by to mohlo vypadat ve světě zpětných volání, ale s přísliby jsme skončili řetězem podobným tomuto:

Sliby nám umožňují čistě zřetězit následné operace a přitom se vyhnout peklu zpětného volání a pokud vždy vrátíte příslib pro každý z vašich tehdejších bloků, bude pokračovat v řetězci.

Async / Čekejte

Nyní je skvělá věc, pokud je moje funkce deklarována jako asynchronní, jednoduše přidáním čekajícího hovoru, udělá přesně to samé jako kterékoli z výše uvedených řešení založených na příslibech es6, ale s ještě čistším značením.

Je to elegantní a jednoduché, ale podle mého názoru je jediným kompromisem způsob, jak řešit chyby. Pravidelné přísliby nám poskytují pěkný a snadný blok chytání, který zjednodušuje řešení výjimek a chyb, zatímco async funkce skutečně nemají pěkný způsob, jak zachytit chyby podle mého vědomí. Takže musíte udělat něco takového.

Teď to není hezké, ale kvůli mému malému příkladu mě prosím oddejte. A samozřejmě existuje spousta triků a strategií, jak se s tím vypořádat ve skutečném světě.

A tady to máte

Aplikace příslibů a asynchronizace / čekání na každodenní použití, s nimiž je obeznámen téměř každý vývojář. Děkujeme, že jste si našli čas na jeho přečtení.

Našli jste chybu? Mluvím nesmysly?

Dejte mi vědět, pokud si myslíte, že mám špatný konec hůlky! Jsem člověk, dělám chyby, rád se z nich učím :)

Prameny:

Jsem v procesu sledování rozhovoru Wese Bose o Async + Await a nemohu to doporučit dostatečně vysoko, pokud chcete vědět více (on popisuje chyby zpracování v mnohem podrobněji, vážně je to skvělé). Vlastně bych doporučil, abych ho následoval obecně (jsem velký fanoušek Wes Bos!).

MDN webové dokumenty o používání příslibů

Webové dokumenty MDB na async + čekají