2016-02-05 169 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