我是初学者,使用延期承诺,无法找到我所提问题的确切答案。
即使对于单个简单的ajax($ http angularjs)调用,也建议使用延迟承诺?我知道如果我们按顺序或同时进行多次ajax调用会很好。
第二个问题是关于可重用性。我在默认页面加载中有一个休息服务的ajax调用来显示项目列表。当过滤器下拉列表发生更改时,则需要在服务中调用相同的方法来重用它。但它带来了与之前相同的结果,所以我不得不使用完全不同的结果。代码如下。有没有办法重复使用原始方法。
控制器:类似的方法,但我需要有不同的承诺。
$scope.applyReportFilter = function(){
$log.log($scope.period);
$scope.periodData = {periodType:$scope.period.id};
var promisT = rptSvc.getAllReportE($scope.periodData);
promisT.then(function(resultW){
$scope.resultReport = resultW;
$log.log("Rpt filter" + resultW);
}).then(function(errorT){
$scope.result = errorT;
});
}
var promis = rptSvc.getAllReport($scope.periodData);
//$log.log($scope.data.period);
promis.then(function(result){
$scope.resultReport = result;
$log.log("Rpt" + result);
}).then(function(error){
$scope.result = error;
});
服务:对于应用过滤器,我必须使用另一种方法来使用不同的延迟。
var dfrdE = $q.defer();
report.getAllReportE=function(prd){
$log.log(prd.periodType);
$http.post(URLs.AllReportURL,prd)
.success(function(respE){
dfrdE.resolve(respE);
}).error(function(respE){
dfrdE.reject(respE);
});
return dfrdE.promise;
}
var dfrd = $q.defer();
report.getAllReport=function(prd){
$log.log(prd.periodType);
$http.post(URLs.AllReportURL,prd)
.success(function(respGR){
dfrd.resolve(respGR);
}).error(function(respGR){
dfrd.reject(respGR);
});
return dfrd.promise;
}
任何建议都会非常有用。
答案 0 :(得分:2)
您已成功在代码中执行了两次Promise anti-patterns。
$http
本身会返回一个$q
承诺,你只是将它包含在另一个承诺中。 $q(..
而不是$q.defer
,因为显式构造函数模式具有更好,更简洁的语法(不需要额外的延迟变量),并且还会从解析程序回调中捕获异常。 。 我并不完全明白你在第二部分问题中想要表达的内容,但你可以减少两个服务电话只是:
report.getAllReport=function(prd){
$log.log(prd.periodType);
return $http.post(URLs.AllReportURL,prd);
}