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

[Angular] $http "synchroniczne" pobranie danych

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.

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...

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

0

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

0

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

$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.

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):

//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;
}
0

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

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