Wszystko co znajduje się w handleUserUpdateRequest poza tym fragmentem:
Kod
getGroupsByIdUser(userId).then(result=>{userGroups=result});
jest wykonywane synchronicznie. Czyli cały kod wykonuje się linijka za linijką jak leci. Wszystko co znajduje się po 'then' wykonywane jest asynchronicznie. Ten fragment kodu reprezentuje moment w czasie kiedy dane (result) są już dostępne. Promise jest po to żeby JS wiedział, że może sobie wykonać wszystko co ma zrobić w ramach handleUserUpdateRequest ale pewne dane reprezentowane jako obiekt Promise będą dostępne później. Później może być za sekundę, minutę itd. handleUserUpdateRequest nie może czekać, ponieważ wykonuje się synchronicznie. Gdyby handleUserUpdateRequest miał czekać na te dane, to skrypt musiałby się zatrzymać do momentu aż dane (result) będą dostępne. Oczywiście tego nie chcemy. Żeby 'udać się' do momentu w czasie w którym dane są już dostępne i zrobić cokolwiek z tymi danymi musisz zrobić to w tym miejscu:
Kod
getGroupsByIdUser(userId).then(result=>{
// do something special with asynchronous data here!
});
To co Ty robisz to przypisujesz result do zmiennej userGroups ale zauważ, że dzieje się to w momencie kiedy dane są dostępne, a nie wtedy kiedy wykonywana jest reszta kodu, który jest synchroniczny. Ta część, która jest synchroniczna już dawno się wykonała, więc poza tym przypisaniem nic się już więcej nie zadzieje.
Jak sobie z tym radzić?
1. Możesz użyć callback'u czyli wcześniej zdefiniować sobie sposób postępowania w momencie kiedy dane będą już dostępne:
Kod
getGroupsByIdUser(userId).then(result=>{
// doSomethingSpecialWithAsynchronousData(result);
});
W bardziej zaawansowanej wersji możesz obsłużyć to eventem, który będzie emitowany w momencie kiedy dane będą dostępne.
2. Jeżeli nie przepadasz za asynchroniczną składnią, możesz użyć specjalnej składni async/await, która powoduje to że kod wygląda jakby był pisany synchronicznie ale jest asynchroniczny.