2014-10-28 39 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

這是承諾的目的。使用您從函數返回的承諾來執行您的操作。例如'deferred.promise'返回'.then(function(){/ * your action * /})''。或者,就你的情況而言(因爲它基本上解決了http響應,所以在post中執行你的動作)。 – haki 2014-10-28 08:15:07

+1

我認爲它不可能同步,但你使用承諾,它允許你控制它,你可以告訴你的應用程序等待,直到它將解決/拒絕 – 2014-10-28 08:21:30

+0

可能重複的[如何$ http與AngularJS同步呼叫](http://stackoverflow.com/questions/13088153/how-to-http-synchronous-call-with-angularjs) – 2015-10-02 14:15:19

回答

6

沒有這是不可能與Angular。

參見https://github.com/angular/angular.js/blob/master/src/ng/httpBackend.js#L51其中XMLHttpRequest的打開與

xhr.open(method, url, true); 

第三個參數在xhr.open()可以設置爲falsetrue,其中假是同步的和真實是異步的。在Angular的情況下,它被硬編碼爲true,這樣所有的傳出呼叫都將是異步的。

使用.success()回調等待異步調用返回,然後做任何你想做的事情。

根據評論中的建議,您當然也可以通過原始javascript,jQuery或任何其他支持同步調用的庫進行調用,但我會建議在異步角度調用中使用回調/延遲,因爲同步呼叫被阻斷,阻塞是不好的。

+1

或jQuery的異步參數,如果他使用jQuery的http://api.jquery.com/jquery。 ajax/ – 2014-10-28 09:05:34

+0

我在角度服務中使用$ http.get請求的響應中的數據,而且我很難做到這一點,因爲響應需要一些時間,並且由於我的代碼用於調用稱爲服務的代碼的異步性質。我沒有使用任何阻止,但我傳遞了我的application.html中的數據,並在服務被調用之前從那裏選擇它。不知道它是否正確,但似乎有效。 – 2014-12-31 07:38:02