Jaki ficzer z ES6 warto poznać?

Są to generatory. Naprawdę aż szkoda, że tak mało ludzi ich używa, bo to pozwala na zajebiste uproszczenie asynchronicznych interakcji. Trochę jak async/await, ale lepsze, bo bardziej elastyczne, masz więcej kontroli. Możesz nad wszystkim panować i zrobić sobie taki własny asynchroniczny framework, zrobić własne mikrowątki/korutyny rodem z Go, tylko, że w JavaScript.

Aż smutne, że to wciąż mało popularne podejście. Poza Redux Sagą chyba się to nie przyjęło jeszcze na masową skalę w JS. A szkoda.

Co do elastyczności to mam na myśli, że generatory są bardziej elastyczne w kwestii interpretowania danej komendy, bo można yieldować cokolwiek: const result = yield 123

oraz od strony funkcji wywołującej generator można to dowolnie interpretować. Czyli to nie jest tylko asynchroniczność, ale też komunikacja między korutynami.

Czyli generatory pod kątem funkcjonalności są bardziej elastyczne niż async/await.

Z drugiej strony rozwiązania oparte o promisy (async/await) w pewnym aspekcie są bardziej elastyczne. Tzn. yield narzuca sposób pisania. Yield działa tylko w danej funkcji generatorowej, która musi być zinterpretowana przez funkcję, która ją wywołuje. Async/await działa wszędzie. Można np. łatwo wywoływać z poziomu jednej funkcji asynchronicznej drugą funkcję asynchroniczną i obie mogą działać "równolegle". Dlatego robiąc w zeszłym roku prototyp frameworku do Three.js (który pozwalał na wygodną interakcję obiektów) robiłem go na async/await (generatory nie działają tak automatycznie, bo ich działanie jest uzależnione od tego, w jaki sposób funkcja, która wywołuje generator, zinterpretuje yieldowane dane).

Jednak... generatory wydają mi się jednak bardziej eleganckim rozwiązaniem i teraz robiąc kolejne podejście, robię to na generatorach. Ale myślę, że nie ma co trzymać się konkretnej implementacji, ważny jest efekt i sama koncepcja korutyn. Więc nie wiem, jeszcze, co wybiorę.

Tak czy siak, jeśli chodzi o asynchroniczność, to warto nauczyć się generatorów (żeby mieć wybór, a nie być ograniczonym do promisów/async/await, które nie zawsze muszą być najlepszym rozwiązaniem. Zresztą to można i tak łączyć w ten czy inny sposób).

To, o jaki sposób używania generatorów mi chodzi (bo generatorów można używać również do czego innego przecież np. do generowania liczb czy coś), można zobaczyć patrząc na kod/podejście z poniższych linków:

Komentarze

Popularne posty z tego bloga

Ściemy z ogłoszeń o pracę

Zostać programistą (2) - czy się nadajesz?

Czego się nauczyłem w 2021?