2016-02-05 63 views
1

我有一些控制器和一個叫獲得從REST WCF Web服務的一些價值功能:

fooBar.controller('fooCtrl', 
      function fooCtrl($scope, $http, $resource) { 
       $scope.someOnClickEvent = function() { 
       GetSomething('a','b','c'); 
      } 
     } 
); 

function GetSomething($scope, $resource, a, b, c) { 
    var ServiceHandle = $resource('some/addr'); 
    var serviceHandle = new ServiceHandle(); 

    serviceHandle.a = a; 
    serviceHandle.b = b; 
    serviceHandle.c = c; 

    serviceHandle.$save().then(function (result) { 
     console.log('So response should be ready'); 
     $scope.result = result.ValueFromService; 
    }); 
} 

至於我知道$save()返回承諾和.then裏面的函數應該在服務器返回響應後立即調用。在我的情況下,它被稱爲imediately。

如果服務返回true,我將顯示一些彈出窗口,所以我需要在執行條件指令之前返回該值。

Angular版本是1.4.9。

+0

儘管源代碼看起來不那麼清晰(實際返回值是'return result。$ promise || result'),但文檔確實表示實例操作會返回一個承諾,該操作同時包含成功和錯誤回調,因此如果承諾 – Duncan

+0

謝謝@Duncan,我錯了,然後像魅力一樣工作,這只是我在異步編程領域缺乏教育;)。 – Landeeyo

回答

2

我分析了代碼及其行爲,顯然我錯了。也許我應該刪除這個問題,但我相信它可以幫助某人理解類似的問題。

.then內部的函數實際上是在響應來自服務器之後調用的。可以使用Chrome的開發者工具(即標籤網絡)對其進行驗證。

但是,如果在調用GetSomething函數後,我們想要訪問$scope.result,我們正在犯一個很大的錯誤。 $scope.result將會是undefined,只要.then內部的函數不會被執行。要使用從服務返回的值,我們必須在.then函數或函數調用的函數中執行該值。

+1

你應該做的是從GetSomething中返回一個承諾:特別返回'serviceHandle。$ save()。then()'的結果,然後任何需要等待完成的代碼都可以這樣做。基本上每個異步函數都會返回一個承諾,然後您可以忽略它或使用它。 – Duncan