[Angular] $http "synchroniczne" pobranie danych

[Angular] $http "synchroniczne" pobranie danych

Wątek przeniesiony 2016-12-25 13:23 z Webmastering przez Ktos.

  • Rejestracja: dni
  • Ostatnio: dni
0

Witam.

Czy istnieje możliwość aby pobrać dane za pomocą $http synchronicznie ?
Coś czytałem o bibliotece $q oraz objekcie deffered, lecz do tej pory nie do końca mogę zrozumieć jak to działa.

Chciałbym po prostu aby po wywołaniu funkcji, wykonywała się ona do czasu aż zwróci ona rzeczywistą odpowiedz,
a nie jej obietnice.

Maciej Cąderek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1264
0

Nie sądzę, a nawet gdyby istniała taka możliwość (przeglądarki wspierają taką opcję) to nigdy przenigdy nie powinieneś z tego korzystać.

Możesz uzyskać kod podobny do synchronicznego za pomocą async-await (ale nie wiem czy angular to wspiera), tyle, że do zrozumienia async-await konieczne jest zrozumienie promise / deferred. Także tego...

  • Rejestracja: dni
  • Ostatnio: dni
0

Dziekuje za odpowiedz.

W takim razie jaki jest najlepszy sposob, aby do np. 10 elementow w tablicy,
do kazdego z nich przypisac jakas wartosc, kazda pobrana przez REST ?

Na chwile obecna albo nic nie dziala mi, albo przypisuje wszedzie tylko ostatnia pobrana wartosc

  • Rejestracja: dni
  • Ostatnio: dni
0

Ewentualnie.. czy jest jakas mozliwosc uzyskania rezultatu, ktory chce uzyskac?
No i na czym polega cale to $q oraz obiekt deffered ?

Maciej Cąderek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1264
0

Użyć Promise.all() w przypadku Angulara chyba $q.all(), np:

Kopiuj
$q
  .all([
    $http({ method: 'GET', url: '/someUrl' }),
    $http({ method: 'GET', url: '/anotherUrl' }),
    // ...etc
  ])
  .then((resultsArray) => {
    // do something with result, for example:
    console.log(resultsArray) 
  })

A o promisach poczytaj np tu: https://github.com/getify/You-Dont-Know-JS/tree/master/async%20%26%20performance
Bez tego daleko nie zajedziesz.

shagrin
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Norwegia, Stavanger
0

@Maciej Cąderek: ma racje z $q.all()

Odnosnie:

W takim razie jaki jest najlepszy sposob, aby do np. 10 elementow w tablicy,
do kazdego z nich przypisac jakas wartosc, kazda pobrana przez REST ?

Mozesz zrobic cos takiego (uwaga pseudokod):

Kopiuj
//zalozmy ze masz obiekty, ktore chcesz zaktualizowac na podstawie wyniku requestu wykonanego dla kazdego z obiektow
 var objs = [{name:"obj1"}, {name:"obj2"}];
 var promises = [];

//dla kazdego wykonujesz request, np
angular.forEach(objs, function(o){
   var promise = doRequest(o);
   promises.push(promise);
});

$q.all(prmises).then(function(){
   console.log("All requests done");
})

function doRequest(obj){
   var deffered = $q.defer();
   $http.get(url+'/'+obj.name)
           .success(function(data){
              obj.something= data;
              deffered.resolve(data);
            })
            .error(function(err){
               deffered.reject(err);
             })
   return defer.promise;
}
  • Rejestracja: dni
  • Ostatnio: dni
0

Dziekuje serdecznie za pomoc, biore sie za lekture, a potem do kodu.
Pozdrawiam!

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.