Timeout w asynchronicznej funkcji.

0

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

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?

4

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

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.

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

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.


1 użytkowników online, w tym zalogowanych: 0, gości: 1