AngularJS deferred 和 promise 的可重用性
AngularJS Reusability with deferred and promise
我是使用 deferred promise 的初学者,无法找到我遇到的问题的确切答案。
即使对于单个简单的 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;
}
任何建议都会很有帮助。
您已经成功地在代码中完成了两项 Promise anti-patterns。
$http
returns 一个 $q
承诺本身,你只是把它包裹在另一个承诺中。
- 需要时,使用
$q(..
而不是 $q.defer
,因为揭示构造函数模式具有更好、更简洁的语法(不需要额外的延迟变量)并且还可以从解析器回调中捕获异常. .
我不完全理解你在问题的第二部分想要传达的内容,但你可以将这两个服务调用简化为:
report.getAllReport=function(prd){
$log.log(prd.periodType);
return $http.post(URLs.AllReportURL,prd);
}
我是使用 deferred promise 的初学者,无法找到我遇到的问题的确切答案。
即使对于单个简单的 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;
}
任何建议都会很有帮助。
您已经成功地在代码中完成了两项 Promise anti-patterns。
$http
returns 一个$q
承诺本身,你只是把它包裹在另一个承诺中。- 需要时,使用
$q(..
而不是$q.defer
,因为揭示构造函数模式具有更好、更简洁的语法(不需要额外的延迟变量)并且还可以从解析器回调中捕获异常. .
我不完全理解你在问题的第二部分想要传达的内容,但你可以将这两个服务调用简化为:
report.getAllReport=function(prd){
$log.log(prd.periodType);
return $http.post(URLs.AllReportURL,prd);
}