• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przypisane wartość obiektu promise do zmiennej ?

Object Storage Arubacloud
0 głosów
250 wizyt
pytanie zadane 3 maja 2018 w JavaScript przez Silverwind Użytkownik (730 p.)
zmienione kategorie 3 maja 2018 przez criss

Od niedawna zacząłem się bawić w javascript. Poczytałem o obiektach Promise i callback.  Chce zwrócić wartość z funkcji getGroupsByIdUser() i przypisać jej wartość do zmiennej userGroups. Istotny jest ten kawałek kodu:

  

var userGroups;
      getGroupsByIdUser(userId).then(result=>{ userGroups=result});
      console.log(userGroups);

Niestety zwraca mi underfinde. Za pomoc w rozwiązaniu problemu z góry dziękuj

Pierwsza funkcja:

function getGroupsByIdUser(userId) {
      /*parentEl = $(this).parent().parent();
      userId = parentEl.attr('data-user-id');*/
      return new Promise(function (resolve, reject) {
          var requestUrl = apiRoot + 'users';
          $.ajax({
              url: requestUrl + '/?' + $.param({
                  id: userId
              }),
              method: "GET",
              contentType: 'application/json',
              success: function (data) {
                   resolve(data);
              }

          })
      })

  }

Druga funkcja:

function handleUserUpdateRequest() {

      var parentEl = $(this).parent().parent();
      var userId = parentEl.attr('data-user-id');
      var userFirstName = parentEl.find('[data-user-firstName-input]').val();
      var userLastName = parentEl.find('[data-user-lastName-input]').val();
      var userPassword = parentEl.find('[data-user-password-input]').val();
      var userBirthdate = parentEl.find('[data-user-birthDate-input]').val();
      var requestUrl = apiRoot + 'users';
      var userGroups;
      getGroupsByIdUser(userId).then(result=>{ userGroups=result});
      console.log(userGroups);


      $.ajax({
          url: requestUrl,
          method: "PUT",
          processData: false,
          contentType: "application/json; charset=utf-8",
          dataType: 'json',
          data: JSON.stringify({
              id: userId,
              firstName: userFirstName,
              lastName: userLastName,
              password: userPassword,
              birthDate: userBirthdate,
              userOfGroupDtos: userGroups


              success: function (data) {
                  parentEl.attr('data-user-id', data.id).toggleClass('datatable__row--editing');
                  parentEl.find('[data-user-firstName-paragraph]').text(userFirstName);
                  parentEl.find('[data-user-lastName-paragraph]').text(userLastName);
                  parentEl.find('[data-user-password-paragraph]').text(userPassword);
                  parentEl.find('[data-user-birthDate-paragraph]').text(userBirthdate);
              }
          })

  });
  }

 

1 odpowiedź

+3 głosów
odpowiedź 3 maja 2018 przez adrian17 Ekspert (344,860 p.)
edycja 3 maja 2018 przez adrian17

Ponieważ nie zrozumiałeś idei asynchroniczności promise'ów.

      var userGroups;
      getGroupsByIdUser(userId).then(result=>{ userGroups=result});
      console.log(userGroups);

Kluczowym tutaj jest, że druga linia opisuje co się stanie w "przyszłości", gdy zapytanie ajaxowe zwróci jakąś wartość. Różnica polega na tym, że kod idzie dalej do przodu, nie czekając - można powiedzieć, że druga linia złożyła zamówienie i idzie dalej nie czekając na jego zakończenie.

To trochę tak, jakby powiedzieć: "włożę ubrania do pralki, a jak pralka skończy, włożę je na suszarkę" ale od razu po włączeniu pralki patrzysz na suszarkę i dziwisz się, czemu jest pusta.

Jeśli chcesz, żeby coś się stało po otrzymaniu odpowiedzi na zapytanie ajaxowe, musisz cały ten kod umieścić w `.then()`.

2
komentarz 3 maja 2018 przez adrian17 Ekspert (344,860 p.)

A na boku, używając składnię async/await, można ten .then() "schować" i dostać kod przypominający synchroniczny:

async function handleUserUpdateRequest() {
  // ...
  let userGroups = await getGroupsByIdUser(userId);
  console.log(userGroups); // dziala
  // ...
}

 

komentarz 3 maja 2018 przez kap Stary wyjadacz (11,620 p.)

@adrian17, Jak włozysz ubrania prosto z pralki do szafy to zatęchną

komentarz 3 maja 2018 przez adrian17 Ekspert (344,860 p.)
Poprawiłem.

Podobne pytania

+1 głos
2 odpowiedzi 128 wizyt
pytanie zadane 10 sierpnia 2019 w JavaScript przez Kamil M Bywalec (2,340 p.)
0 głosów
1 odpowiedź 320 wizyt
pytanie zadane 12 czerwca 2019 w JavaScript przez VLeniowy Nowicjusz (190 p.)
0 głosów
1 odpowiedź 294 wizyt
pytanie zadane 23 grudnia 2018 w JavaScript przez kacperk89 Nowicjusz (140 p.)

92,581 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...