具有延迟和承诺的AngularJS可重用性
我是一个使用延迟承诺的初学者,对于我提出的问题,我找不到确切的答案具有延迟和承诺的AngularJS可重用性,angularjs,ajax,promise,deferred,Angularjs,Ajax,Promise,Deferred,我是一个使用延迟承诺的初学者,对于我提出的问题,我找不到确切的答案 即使对于单个简单的ajax($http angularjs)调用,也确实推荐延迟承诺?我知道,如果我们有很多ajax调用顺序地或同时进行,这是很好的 第二个问题是关于可重用性。我在默认页面加载中使用ajax调用rest服务来显示项目列表。当过滤器下拉列表发生更改时,您希望在服务中调用相同的方法以重用它。但它带来了和前面相同的结果,所以我不得不使用完全不同的一个。代码如下所示。有没有办法重用原始方法 控制器:类似的方法,但我需
- 即使对于单个简单的ajax($http angularjs)调用,也确实推荐延迟承诺?我知道,如果我们有很多ajax调用顺序地或同时进行,这是很好的
- 第二个问题是关于可重用性。我在默认页面加载中使用ajax调用rest服务来显示项目列表。当过滤器下拉列表发生更改时,您希望在服务中调用相同的方法以重用它。但它带来了和前面相同的结果,所以我不得不使用完全不同的一个。代码如下所示。有没有办法重用原始方法
$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;
}
任何建议都会非常有用。您已经在代码中完成了两项工作
- 返回一个
承诺本身,您只是将其包装在另一个承诺中李>$q
- 需要时,使用
而不是$q(..
,因为显示的构造函数模式具有更好、更简洁的语法(不需要额外的deferred变量),并且还可以捕获解析程序回调中的异常$q.defer
report.getAllReport=function(prd){
$log.log(prd.periodType);
return $http.post(URLs.AllReportURL,prd);
}
您已经成功地在代码中执行了两项操作
- 返回一个
承诺本身,您只是将其包装在另一个承诺中$q
- 需要时,使用
而不是$q(..
,因为显示的构造函数模式具有更好、更简洁的语法(不需要额外的deferred变量),并且还可以捕获解析程序回调中的异常$q.defer
report.getAllReport=function(prd){
$log.log(prd.periodType);
return $http.post(URLs.AllReportURL,prd);
}
第二部分中的错误是在使用延迟的函数之外创建延迟。这将导致相同的结果(已完成)在后续调用中返回承诺,而不是创建新的承诺。当然,取消延迟反模式可以解决此问题。严格来说,没有两个反模式,只有一个反模式两次。此外,
$q.defer
和其他形式的承诺创建不能完全被禁止-它们是必要的(在不同情况下)用于“承诺”非承诺返回异步函数。感谢@mido的快速回答。我的第二个问题是重用已经使用过的方法。我有一个方法在页面加载时调用Rest服务。我想在事件-applyfilter-中使用相同的方法,但具有不同的值,而不创建新的延迟和承诺。@Roamer-1888我不反对pr在异步调用方面,我的问题是使用$q.defer
而不是$q(..
),Bergi这样做的原因是:基本上是因为揭示构造函数模式具有更好、更简洁的语法(不需要额外的延迟变量),并且还捕获解析程序回调中的异常。@Mido,你的要点“不要使用$q.defer,这是一种差异反模式”并没有反映这些要点,并且具有误导性。第二部分中的错误是在使用它们的函数之外创建了差异。这导致了相同的结果(已实现)在后续调用中返回承诺,而不是创建新的承诺。当然,取消延迟反模式可以解决此问题。严格来说,没有两个反模式,只有一个反模式两次。此外,$q.defer
和其他形式的承诺创建不能完全被禁止-它们是必要的(在不同情况下)用于“承诺”"非承诺返回异步函数。感谢@mido的快速回答。我的第二个问题是重用已经使用过的方法。我有一个方法在页面加载时调用Rest服务。我想在事件-applyfilter-中使用相同的方法,但具有不同的值,而不创建新的延迟和承诺。@Roamer-1888我不反对pr在异步调用方面,我的问题是使用$q.defer
而不是$q(..
),Bergi这样做的原因是:基本上是因为揭示构造函数模式具有更好、更简洁的语法(不需要额外的延迟变量),并且还捕获解析程序回调中的异常。@Mido,你的要点“不要使用$q.defer,这是不同的反模式”并没有反映这些观点,而且非常误导。