我的控制器已注入所有必需的依赖项。
$scope.connect = function(url) {
var defer = $q.defer();
var promise = $http.get(url).then(function (response) {
$timeout(function(){
defer.resolve(response);
},10000);
defer.resolve(response);
$scope.$apply(); //$rootScope.$apply();
});
return defer.promise;
};
$scope.mymethod = function(){
$scope.globalMydata[];
console.log("before the http get");
$scope.connect("MY_URL").then(function(data) {
console.log("called!", data);
console.log("INSIDE the http get");
$scope.mydata = data;
//$scope.globalMydata.push(data);
});
console.log("after the http get ");
//do some processing of the returned data here
var dataHolder = $scope.mydata;
return calculatedValue;//value from procesing
}
当代码执行时#34; INSIDE http get"被调用作为最后一个调试日志。我从get调用中得到了结果但是由于它稍后返回,我无法使用它进行任何处理。这是我们承诺的正确理由吗?我需要承诺的数据在控制器内部进行一些处理。
我的承诺实施中的任何问题?
答案 0 :(得分:1)
我不确定我是否得到了你的问题,但看起来你已经建立了一个承诺的交叉点,但从你的问题来看,你似乎只想要常规的承诺行为。所以我会尝试......
我不是一个有角度的专家,但我确实使用了$ http承诺,而且我的方法就是这样做的。
我将$ http调用注册为服务,如下所示:
app.service('ajax',function(host,$http){
this.post = function(api,data,cb){
$http.post(host + api,data).success(cb)
};
this.get = function(api,cb){
$http.get(host + api).success(cb)
}
});
主机是预定义的module.value。我将此服务注入每个需要调用http请求的控制器并按如下方式操作:
ajax.post('users', UserToken, function(data){
console.log('Users points: ' + data.points)
})
据我所知,$ http已经内置了承诺,所以不需要q和defere,它们都是在后台完成的。 ajax.post
调用服务,将data
发送到host + 'users'
,服务器端通过其令牌查找用户,并返回一些数据,其中一个密钥的名称为points
用户点的价值。客户端:从服务器成功回复后,它将进入cb
功能,然后控制台记录用户点。
所以我可以对cb函数中的promise做任何修改,因为在服务器成功回复之前没有调用它。
success
和error
方法还有一些可选参数,请查看here。