2014-10-28 12 views
6

Mam usługi dla wywołania API w następujący sposób,

getValue: function(input) { 
     var deferred, url; 
     deferred = $q.defer(); 
     url = "url"; 
     $http.post(url, input).success(function(data, status, headers, config) { 
      return deferred.resolve({ 
      success: true, 
      data: data, 
      status: status, 
      headers: headers, 
      config: config 
      }); 
     }).error(function(data, status, headers, config) { 
      return deferred.resolve({ 
      success: false, 
      data: data, 
      status: status, 
      headers: headers, 
      config: config 
      }); 
     }); 
     return deferred.promise; 
     } 

Ale to asynchroniczny. Jak mogę go przekonwertować na synchronizację (chcę sprawić, aby poczekałem, aż otrzymam wynik)?

+1

Po to są obietnice. Wykonaj swoje działanie, używając obietnicy, którą zwrócisz z funkcji. np. 'deffered.promise' zwróciłeś' .then (function() {/ * twoje działanie * /}) '. Lub, w twoim przypadku (ponieważ w zasadzie odpowiada to odpowiedzi http, wykonaj swoje działanie w poście fn). – haki

+1

Myślę, że nie da się tego zsynchronizować, ALE używasz obietnicy, która pozwala ci mieć kontrolę nad nią, i możesz powiedzieć, że twoja aplikacja czeka, aż to rozwiąże/odrzuci –

+0

Możliwy duplikat [Jak synchronizować połączenie HTTP z AngularJS ] (http://stackoverflow.com/questions/13088153/how-to-http-synchronous-call-with-angularjs) –

Odpowiedz

6

Nie jest to niemożliwe w przypadku Angular.

Zobacz https://github.com/angular/angular.js/blob/master/src/ng/httpBackend.js#L51 gdzie XMLHttpRequest jest otwierany z

xhr.open(method, url, true); 

trzeci parametr w xhr.open() można ustawić false lub true, gdzie fałszywa jest synchroniczna i asynchroniczna jest prawdą. W przypadku Angular jest on zakodowany na stałe na true, więc wszystkie połączenia wychodzące będą asynchroniczne.

Użyj wywołania zwrotnego .success(), aby poczekać na powrót wywołania asynchronicznego, a następnie wykonaj, co chcesz tam zrobić.

Zgodnie z sugestią zawartą w komentarzach, można oczywiście wykonywać połączenia za pośrednictwem surowego javascript, jQuery lub dowolnej innej biblioteki obsługującej synchroniczne wywołania, ale radzę użyć wywołań zwrotnych/odstraszania z asynchronicznym wywoływaniem kątowym, ponieważ synchroniczne połączenia są blokowane, a blokowanie jest złe.

+1

Lub asynchronizuj jquery jeśli używa on jquery http://api.jquery.com/jquery. ajax/ –

+0

Używałem danych z odpowiedzi żądania $ http.get w kanciastej usłudze i ciężko mi było to zrobić, ponieważ odpowiedź zajęła trochę czasu i ze względu na asynchroniczną naturę mój kod był używany do wywoływania kodu, który wywołał usługę. Nie użyłem żadnego blokowania, ale przekazałem dane w pliku application.html i wybrałem je stamtąd przed wywołaniem usługi. Nie wiem, czy jest to właściwy sposób, ale wydaje się, że działa. –

Powiązane problemy