2014-10-28 2 views
6

나는, 다음과 같은 API의 호출에

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

을하는 서비스를하지만이 비동기입니다. 동기화로 변환하려면 어떻게해야합니까? (결과를 얻을 때까지 기다리게하고 싶습니다)?

+1

약속의 내용입니다. 함수에서 반환하는 약속을 사용하여 액션을 수행하십시오. 예를 들어'deffered.promise'가'.then (function() {/ * your action * /})'을 리턴합니다. 또는 귀하의 경우 (기본적으로 HTTP 응답으로 해결되므로 게시 fn에서 귀하의 조치를 수행하십시오). – haki

+1

나는 동기화를 할 수 없다고 생각하지만, 당신이 그것을 제어 할 수있는 약속을 사용하고, 앱이 해결/거부 될 때까지 기다릴 수 있다고 말할 수있다. –

+0

[How to $ http AngularJS ] (http://stackoverflow.com/questions/13088153/how-to-http-synchronous-call-with-angularjs) –

답변

6

각도로는 불가능합니다. XMLHttpRequest의 거짓 동기 및 비동기 사실 falsetrue 또는로 설정 될 수 xhr.open()

xhr.open(method, url, true); 

세번째 파라미터로 개방된다

https://github.com/angular/angular.js/blob/master/src/ng/httpBackend.js#L51 참조. Angular 경우에는 true으로 하드 코딩되어 모든 발신 전화가 비동기가됩니다.

.success() 콜백을 사용하면 비동기 호출이 반환 될 때까지 대기 한 다음 거기에서 무엇을 하든지 할 수 있습니다.

의견에있는 제안에 따라 당연히 원시 자바 스크립트, jQuery 또는 동기 호출을 지원하는 다른 라이브러리를 통해 호출 할 수도 있지만 비동기 호출로 콜백/수퍼바이저를 사용하는 것이 좋습니다. 왜냐하면 동기식 통화가 차단되고 차단이 안됩니다.

+1

또는 그가 jquery http://api.jquery.com/jquery를 사용하는 경우 jquery async param. ajax/ –

+0

각도 서비스에서 $ http.get 요청의 응답에서 데이터를 사용하고 있었고 응답 시간이 오래 걸리고 비동기 성질로 인해 내 코드가 서비스를 호출 한 코드를 호출하는 데 사용되기 때문에 힘든 시간을 보냈습니다. 어떤 차단도 사용하지 않았지만 서비스가 호출되기 전에 내 application.html의 데이터를 전달하고 거기에서 데이터를 선택했습니다. 그것을 할 수있는 올바른 방법이 있는지는 모르겠지만 작동하는 것 같습니다. –