$保存(),然后对角$资源不等待服务响应
问题描述:
我有一些控制器和一个叫获得从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。
答
我分析了代码及其行为,显然我错了。也许我应该删除这个问题,但我相信它可以帮助某人理解类似的问题。
.then
内部的函数实际上是在响应来自服务器之后调用的。可以使用Chrome的开发者工具(即标签网络)对其进行验证。
但是,如果在调用GetSomething函数后,我们想要访问$scope.result
,我们正在犯一个很大的错误。 $scope.result
将会是undefined
,只要.then
内部的函数不会被执行。要使用从服务返回的值,我们必须在.then
函数或函数调用的函数中执行该值。
+1
你应该做的是从GetSomething中返回一个承诺:特别返回'serviceHandle。$ save()。then()'的结果,然后任何需要等待完成的代码都可以这样做。基本上每个异步函数都会返回一个承诺,然后您可以忽略它或使用它。 – Duncan
尽管源代码看起来不那么清晰(实际返回值是'return result。$ promise || result'),但文档确实表示实例操作会返回一个承诺,该操作同时包含成功和错误回调,因此如果承诺 – Duncan
谢谢@Duncan,我错了,然后像魅力一样工作,这只是我在异步编程领域缺乏教育;)。 – Landeeyo