Timeout w asynchronicznej funkcji.

Timeout w asynchronicznej funkcji.
Gouda105
  • Rejestracja:prawie 8 lat
  • Ostatnio:około miesiąc
  • Postów:487
0

Witam,
załóżmy, że mam taki kod

Kopiuj
async function cycle(){
        await somefunction(){...}

        setTimeout(cycle, 700);
    }

I czy teraz mogę mieć pewność, że timeout wykona się po ukończeniu funkcji somefunction, a nie w trakcie jej działania?

szatkus
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 3 lata
  • Postów:227
4

Ale masz tam await. JS nie dojdzie nawet do tego setTimeout dopóki ta funkcja się nie wykona.


𐤃𐤐𐤀
Gouda105
  • Rejestracja:prawie 8 lat
  • Ostatnio:około miesiąc
  • Postów:487
0

@szatkus: Czy async nie powodowało właśnie, że funkcja jest wykonywana coś w stylu w tle, że somefunction jest uruchamiane i w czasie jej przetwarzania już wykonuje się następna linijka kodu, a bez async przed function kod wykonuje się linijka po linijce i dopiero po ukończeniu operacji znajdującej się w pierwszej linijce, dopiero przechodzi do drugiej? Wydawało mi się, że to, co mówisz ma miejsce tylko po użyciu then.

edytowany 1x, ostatnio: Gouda105
AI
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:375
6

Nie, async i await (przy czym awaita możesz używać tylko w async funkcjach - i async sam zwraca promisa) to syntactic sugar, żebyś nie musiał wszędzie mieć zagnieżdżonych Promise.then. Tak na prawdę, z tego i tak powstanie chain Promise.then'ow, ale nie będzie on dla "Ciebie widoczny w kodzie".

Edit: powyższe to odpowiedź do twojego ostatniego pytania. Natomiast do pytania z tematu - setTimeout wykona się po someFunction

edytowany 3x, ostatnio: Aisekai
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8423
3

Czy async nie powodowało właśnie, że funkcja jest wykonywana coś w stylu w tle, że somefunction jest uruchamiane i w czasie jej przetwarzania już wykonuje się następna linijka kodu, a bez async przed function kod wykonuje się linijka po linijce i dopiero po ukończeniu operacji znajdującej się w pierwszej linijce, dopiero przechodzi do drugiej? Wydawało mi się, że to, co mówisz ma miejsce tylko po użyciu then.

Abstrahując od samego async/await i promisów/then, to przyda się wiedza o tzw. pętli zdarzeń w JS. Generalnie w samym JS kod się wykonuje synchronicznie (czyli linijka po linijce) i jak się wykona wszystko, co się może wykonać synchronicznie, to dopiero silnik za scenami przetwarza rzeczy, które są asynchroniczne (hasło do wyszukania: event loop. A także microtask queue, w którym są obsługiwane promisy) i jak są jakieś zdarzenia/zadania (np. rozwiązane promisy, timeouty, zdarzenia myszy itp.), to znowu odpala się kod JS, ten który widzimy. No i odpala się, aż się wszystko uruchomi co trzeba. I tak w kółko.



edytowany 1x, ostatnio: LukeJL

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.