Funkcje async
oraz słowo kluczowe await
są częścią es8 (es2017). Nie są dostępne we wszystkich przeglądarkach,
chociaż ich wsparcie jest bardzo duże. Jeśli jesteś zainteresowany w jaki sposób Babel konwertuje async..await
, aby
przeglądarki, które ich nie obsługują mogły uruchomić ten kod, to ten wpis jest dla Ciebie. Kod ten wygląda jak
jeden do jeden dlatego pomyślałem, że warto o tym napisać.
Generatory to część es6 czyli es2015 i właśnie za ich pomocą Babel tworzy funkcje, które w oryginale używają słowa
kluczowego async
. Udostępnia też kod tzw. regenerator dla kodu, który korzysta z generatorów (jeśli nie zmusimy
go aby tego nie robił), ale my nie będziemy się nim tutaj zajmować.
Poniżej prosta funkcja asynchroniczna, korzystająca z async..await
, która zwraca tytuł pliku RSS, dla strony
Głównie JavaScript (blog używa CORS, więc można użyć tego
kodu też na innych stronach np. z CodePen, link na końcu):
Ta sama funkcja jako generator wygląda tak:
Jedyna różnica to gwiazdka po słowie function
zamiast słowa async
oraz słowo yield
zamiast await
.
Aby ten kod zadziałał, możemy wykorzystać ciekawą właściwość iteratorów (czyli niskopoziomowego api, które kryje są
za generatorami), a mianowicie możemy przekazać wartość, do następnego wywołania funkcji next
iteratora i ta
wartość zostanie zwrócona przez słowo kluczowe yield
, kiedy iterator wznowi swoje działanie.
Funkcja która przetworzy generator i zwróci obietnice wartości, jaką zwraca oryginalna funkcja, wygląda tak:
A tutaj jak wywołać funkcje unwind wraz z generatorem:
Na koniec moje demko na CodePen, które zawiera kod z tego wpisu.
Komentarze
Hasło, które podasz umożliwi ponowne zalogowanie się i np. usunięcie komentarza, jest dobrowolne. Email jest szyfrowany i używany do wysyłania powiadomień o odpowiedziach do komentarzy oraz do pobierania awatara dzięki usłudze Gravatar.com.