Wpis z mikrobloga

Mam propozycję na temat asynchroniczności JavaScript.

W kwestii asynchroniczności Istnieją Generators, Promises i callbacki, w ES7 async functions.

Ja proponuję:

Wszystkie funkcje oparte o Promises (np. fetch) i zwykłe callbacki zmienić w funkcje synchroniczne.
Zrezygnować całkowicie z Promises.
Generatory być może znajdą swoje zastosowanie, widziałem takie przykłady gdzie nie chodziło o taką asynchroniczność.

Zamiast wprowadzać async function w wersji z ES7 zrobić tak:

Funkcje definiować bez polecenia async, bo jest niepotrzebny, wewnątrz nie będzie żadnej asynchronicznej funkcji i nie będzie potrzebne polecenie await.

function foo () {
var response = fetch();
}

Taką funkcję będzie można wywołać i synchronicznie i asynchronicznie, w zależności od potrzeby:

(function () {

function foo () {
var response = fetch();
}

foo(); // to będzie synchronicznie
async foo(); // to będzie asynchroniczne

var response = fetch(); // można też użyć fetch bezpośrednio synchronicznie

}());

Nie ma tutaj potrzeby użycia fetch asynchronicznie, bo to funkcja foo jest callbackiem i ona jest asynchroniczna - tak jak przy użyciu generatorów i yield lub ES7 async functions.

Czy tylko mi się wydaje to o wiele prostsze, jednocześnie bardziej uniwersalne i bardziej intuicyjne?

W przypadku addEventListener nie ma żadnego problemu, bo callback(funkcja wywołana zdarzeniem) i tak jest poza głównym obiegiem.

Wymaga to ponownego przemodelowania wszystkiego, tak jak było jakiś czas temu przy wdrażaniu Promises. Ale przykład Promises pokazuje że jest to wykonywalne.

Co sądzicie? Zauważyliście jakieś przeszkody? Ja nie. Jeśli coś znajdziecie to napiszcie.

Jeśli wam się podoba to zgłoście do Mozilli, Google, W3C i gdzie tam jeszcze trzeba. Nie zapomnijcie o tym napisać i dać linka w komentarzu pod tym psotem.

#webdev #es6 #es2015 #es7 #es2016 #javascript #nodejs #programowanie

  • 19
@l-_-l: @xaxes Przede wszystkim chciałem najpierw omówić, drugie że zgłoszenia są tylko po angielsku i miałbym z tym problem. Trzecie że znam bugzilla i jeszcze jakieś jedno miejsce jak bym poszukał. Spodziewam się że tutaj zna ktoś jeszcze inne miejsca.
@look997:

to tak nie działa, nie jesteś w stanie odciąć się od asynchroniczności tylko dlatego że używasz generatorów lub async/await. nadal piszesz asynchroniczny kod, tylko sobie deilkatnie pomagasz async/awaitem.

gdyby taka funkcja powstała to dla nowych osób byloby to jeszcze większe zamierzanie niż poprzednio. druga sprawa że to nie tak prosto da się to załatwić, bo ostatecznie na wierzchołku funkcji asynchronicznych zjadzie się taka, która będzie musiała zwrócić promise na podstawie
@larvaexotech: Czy mnie dobrze zrozumiałeś? Ja nie mówię że nie będzie asynchroniczności tylko będzie ona w postaci funkcji wywołanych poleceniem async.
Nic nie mówię o żadnym odcinaniu od asynchroniczności.

Nie, po prostu jak wywołasz funkcję poleceniem async to ona jest poza głównym obiegiem.

Jak to zamieszanie? przecież tutaj jest mniej dodatkowych poleceń, domyślnie działa wszystko synchronicznie. Wszystko proste i przejrzyste.

Chcę zlikwidować całkowicie Promise. Przecież kiedyś nie było Promise a asynchroniczność
@kalectwo: Ja tak napisałem bo mam takie wrażenie, że z całą asynchronicznością poszło się w zupełnie "na-okrągłym" kierunku. To wszystko teoretycznie zmierza do tego co zaproponowałem, ale po drodze robią jakieś nieco pokraczne konstrukcje z Promise, generatorami, async await. To jest zbędne bo moja propozycja daje ten sam efekt tyle że z prostszym kodem.

Zgadzasz się?
@look997: @Borsuk_Miodowy: @kalectwo:

Zrób transpilera w postaci pluginu do babela to zobaczymy w praktyce jak to działa.

Mi się async/await podoba bo jasno mi mówi co się dzieje w kodzie:

async function xx() { return 5; } <-- ta funkcja zwraca Promise

async function yy() {
const config = await fs.readFileAsync( '/config.json' ); <-- program będzie czekał na wynik asynchroniczenj operacji
}

Ja wolę takie rzeczy wiedzieć niż skakać
@larvaexotech @kalectwo: Spróbuję zrobić plugin do Babel chociaż nie wiem jeszcze jak. :)

Od biedy możesz dać komentarz /*await*/. ;)
Jeśli funkcja ma tyć typowo tylko asynchroniczna to możesz jej dać nazwę xxAsync. Tak jak się czasem podpisuje funkcję callback. Tak myślę, że to by wystarczyło?

Z tym await to jest temat, ale na przykładach:
moduły są synchroniczne i wiadomo że są i nie jest to problem. w WebWorkerach też jest
Może coś z tym poradzimy?


@look997: Może nic? Jest pierdylion języków działających kaskadowo, masz ruby, php, python, java, c#. Node.js jest jaki jest, dla Ciebie może to być wadą ale ja widzę w tym dużo zalet.