Khaine
#javascript #programowanie

Bawię się javascriptem aby sobie popatrzeć jak działają async/await w stosunku do C# (for science) i znalazłem na jakiejś stronce ( https://devenv.pl/async-await-podstawy-jezyka-javascript/ ) taki przykładowy kod:

const cityAPI = 'https://www.mocky.io/v2/5a945fa435000074009b0e78';

async function app(){
const city1Request = fetch(cityAPI).then(r => r.json());
const city2Request = fetch(cityAPI).then(r => r.json());

const [city1, city2] = await Promise.all([city1Request, city2Request]);

console.log(city1.name);
console.log(city2.name);
}
app();

Niestety wykonuje się on u mnie synchronicznie patrząc na network w Chrome. Tu jest jakiś błąd czy coś?
  • Najlepsze
  • Wszystkie komentarze
Khaine
Khaine Autor
1
@sokytsinolop: Bez niego jest to samo.

const cityAPI = 'https://www.mocky.io/v2/5a945fa435000074009b0e78';

async function app(){
const city1Request
Khaine
Khaine Autor
1
@sokytsinolop: A te theny nie mają znaczenia, bo then wykonuje się potem, nadal asynchrocznicznie. Dopóki nie napotka na await, to leci asynchronicznie. Tak by było w C# i zapewne tak samo jest tutaj.

Sprawdziłem to nawet, i tych thenów tam może być pewnie i pińcet, ale dopóki nie zobaczy awaita to sobie będą żyć swoim życiem.
chrzano
@Khaine: Domyślnie Promisy wykonywane są asynchroniczne. async/await służy do synchronizacji.
e.....d
e.....d
@Khaine: A jak patrzysz? U mnie wygląda async:
Khaine
Khaine Autor
0
@SuppressWarnings: @chrzano: No facet w przykładzie pokazywał, że wykonuje się to jednocześnie. Natomiast tak się nie dzieje. Nawet w C# +- podobny kod zachowałby się tak, że te dwa fetche wystartują jednocześnie, natomiast funkcja będzie czekać na awaicie aż oba się zakończą i dopiero wtedy pójdzie dalej.
Khaine
Khaine Autor
0
@elmccd: No tutaj się zrobił asynchronicznie. Czemu w takim razie u mnie jedzie jeden za drugim?
Khaine
Khaine Autor
0
sokytsinolop
@Khaine: bo dałeś then, który natychmiast wykonuje promise
Khaine
Khaine Autor
0
@sokytsinolop: Powiem szczerze, że nawet opakowałem te fetche w osobną funkcję async żeby mieć pewność, że to się odpali gdzieś na boku i nadal jest to samo. Jest jakaś inna metoda aby powiedzieć JSowi że ma to odpalić w innym wątku? Jak Task.Run() w C# czy coś w ten deseń?
stacktrace
stacktrace
@Khaine: Puść drugi request do innego zasobu.
sokytsinolop
@Khaine: jak miałeś then to wykonywały się natychmiast, bo tak działa then. Jeśli chcesz zrobić to co chcesz zrobić to musisz w taki sposób

https://stackoverflow.com/questions/31710768/how-can-i-fetch-an-array-of-urls-with-promise-all
M.....i
M.....i
@Khaine: Tu jest kwestia webworkerów bardziej. Silnik js jest synchroniczny. Przykładowo eventy są obsługiwane dopiero kiedy stack z execution context jest pusty.
stacktrace
stacktrace
Khaine
Khaine Autor
0
@stacktrace: Huh, wygląda na to że Chrome po prostu nie pozwala puścić dwóch requestów na raz do tego samego miejsca. Do drugiego zasobu poleciał już asynchronicznie zgodnie z oczekiwaniami. To jak udało się na Chrome autorowi tego przykładu to zrobić?
stacktrace
stacktrace
@Khaine pozwala ale trzeba wyłączyć cache.