Używałem już funkcji ECMAScript 6 i ECMAScript 7 (dzięki Babel) w moich aplikacjach - zarówno mobilnych, jak i internetowych.
Pierwszym krokiem było oczywiście przejście na poziomy ECMAScript 6. Nauczyłem się wielu wzorców asynchronicznych, obietnic (które są naprawdę obiecujące), generatorów (nie wiem, dlaczego symbol *) itd. Z tego obietnice całkiem dobrze pasowały do mojego celu. Używam ich dość często w moich aplikacjach.
Oto przykład / pseudokod pokazujący, jak zaimplementowałem podstawową obietnicę-
var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});
myPromise.then(
function (x) {
init(x);
});
W miarę upływu czasu, natknąłem ECMAScript 7 możliwości, a jedną z nich jest ASYNC
i AWAIT
słowa kluczowe / funkcje. Te w połączeniu czynią wielkie cuda. Zacząłem zastępować niektóre obietnice async & await
. Wydaje się, że dodają wielką wartość do stylu programowania.
Ponownie, oto pseudokod pokazujący, jak wygląda moja funkcja async, await-
async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);
Pomijając błędy składniowe (jeśli występują), obaj robią dokładnie to samo, co ja czuję. Prawie udało mi się zastąpić większość moich obietnic asynchronicznym, czeka.
Dlaczego asynchroniczne oczekiwanie jest potrzebne, gdy obietnice mają podobną pracę?
Czy async, w oczekiwaniu na rozwiązanie większego problemu? A może było to po prostu inne rozwiązanie do piekła zwrotnego?
Jak powiedziałem wcześniej, jestem w stanie korzystać z obietnic i asynchronii, czekam na rozwiązanie tego samego problemu. Czy jest coś konkretnego, co czeka na rozwiązanie async?
Dodatkowe uwagi:
W moich projektach React i modułach Node.js intensywnie korzystałem z asynchronii, oczekiwań i obietnic. Szczególnie React byli wczesnym ptaszkiem i przyjęli wiele funkcji ECMAScript 6 i ECMAScript 7.
Odpowiedzi:
async/await
po prostu zapewnia synchroniczne wrażenie kodu asynchronicznego. To bardzo elegancka forma cukru syntaktycznego.W przypadku prostych zapytań i manipulacji danymi Obietnice mogą być proste, ale jeśli napotkasz scenariusze, w których występuje złożona manipulacja danymi i nie jest to związane, łatwiej jest zrozumieć, co się dzieje, jeśli kod po prostu wygląda tak, jakby był synchroniczny (innymi słowy, składnia sama w sobie jest formą „przypadkowej złożoności”, którą
async/await
można obejść).Jeśli chcesz wiedzieć, możesz użyć biblioteki takiej jak
co
(obok generatorów), aby uzyskać ten sam rodzaj wrażenia. Takie rzeczy zostały opracowane, aby rozwiązać problem, któryasync/await
ostatecznie rozwiązuje (natywnie).źródło
Async / Await zapewnia znacznie ładniejszą składnię w bardziej złożonych scenariuszach. W szczególności wszystko, co dotyczy pętli lub pewnych innych konstrukcji, takich jak
try
/catch
.Na przykład:
while (!value) { const intermediate = await operation1(); value = await operation2(intermediate); }
Ten przykład byłby znacznie bardziej zawiły przy użyciu obietnic.
źródło
const getValue = value => value || operation1().then(operation2).then(getValue);
Pierwszą rzeczą, którą musisz zrozumieć, że
async
/await
syntax to tylko cukier syntaktyczny, który ma na celu zwiększenie obietnic. W rzeczywistości zwracana wartośćasync
funkcji jest obietnicą.async
/await
syntax daje nam możliwość pisania asynchronicznego w sposób synchroniczny. Oto przykład:Łańcuch obietnicy:
function logFetch(url) { return fetch(url) .then(response => response.text()) .then(text => { console.log(text); }).catch(err => { console.error('fetch failed', err); }); }
Async
funkcjonować:async function logFetch(url) { try { const response = await fetch(url); console.log(await response.text()); } catch (err) { console.log('fetch failed', err); } }
W powyższym przykładzie
await
czeka nafetch(url)
rozwiązanie lub odrzucenie obietnicy ( ). Jeśli obietnica zostanie rozwiązana, wartość jest przechowywana wresponse
zmiennej, a jeśli obietnica zostanie odrzucona, zgłosi błąd i w ten sposób wejdzie docatch
bloku.Już teraz widzimy, że użycie
async
/await
może być bardziej czytelne niż łączenie obietnic. Jest to szczególnie prawdziwe, gdy rośnie liczba obietnic, z których korzystamy. Zarówno łączenie obietnicy, jak iasync
/await
rozwiązanie problemu piekła zwrotnego, a wybór metody zależy od osobistych preferencji.źródło
Pełne porównanie z zaletami i wadami.
Zwykły JavaScript
Async (biblioteka)
Obietnice
Generatory
Async czekaj
źródło
Async / await może pomóc w uczynieniu kodu czystszym i bardziej czytelnym w przypadkach, gdy potrzebujesz skomplikowanego przepływu sterowania. Tworzy również kod bardziej przyjazny dla debugowania. I umożliwia obsługę błędów synchronicznych i asynchronicznych za pomocą just
try/catch
.Niedawno napisałem ten post przedstawiający zalety async / await nad obietnicami w niektórych typowych przypadkach użycia z przykładami kodu: 6 powodów, dla których JavaScript Async / Await Blows Promises Away (Tutorial)
źródło