【发布时间】:2015-01-23 18:24:55
【问题描述】:
这是对我的previous question 的跟进。
我有一个需要一些时间的 AJAX 请求。假设我得到两部分数据,var1 和 var2。我只想在绑定到主控制器范围的指令中使用 var1
var1: '=',
我从服务中获得了 var1 和 var2 的组合,但由于它们有不同的目的,我不能简单地使用从 $http 调用中获得的一个承诺。
我尝试实现它,但它仍然无法按我的预期工作。服务形式如下:
myModule.service('MyService', ['$http', '$q', function($http, $q) {
var var1 = $q.defer();
var var2 = $q.defer();
httpPromise = $http({
url: "/myService",
method: "GET",
params: {}
}).success(function(data, status) {
var1.resolve(data.var1);
var2.resolve(data.var2);
})
return {
getVar1: function() {
return var1.promise;
},
getVar2: function() {
return var2.promise;
},
}
}]);
在控制器中,我按如下方式分配承诺:
$scope.var1 = MyService.getVar1();
$scope.var2 = MyService.getVar2();
但是,一旦在服务中解决了承诺,该指令似乎不知道 var1 的值已更改。我认为这将由 AngularJS 引擎处理。
在我看来,这里唯一的方法是进行大量 then() 调用,这会带来更多的混乱而不是好处。我想我会留下来(我想这是一个丑陋的黑客......)
$scope.$watch('var1', ...)
在指令内,除非有人告诉我更好的方向。
【问题讨论】:
-
你需要使用
then()来访问promise解析的数据。你的vars现在只是承诺。还有为什么要分开?只需将整个数据对象传递给控制器,然后将其中一个属性传递给指令。也不需要$q,因为$http返回一个承诺。只是添加代码膨胀
标签: angularjs asynchronous promise