AngularJS具有延迟和承诺的可重用性

时间:2016-01-22 02:20:28

标签: angularjs ajax promise deferred

我是初学者,使用延期承诺,无法找到我所提问题的确切答案。

  • 即使对于单个简单的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;
}

任何建议都会非常有用。

1 个答案:

答案 0 :(得分:2)

您已成功在代码中执行了两次Promise anti-patterns

  • $http本身会返回一个$q承诺,你只是将它包含在另一个承诺中。
  • 如果需要,请使用$q(..而不是$q.defer,因为显式构造函数模式具有更好,更简洁的语法(不需要额外的延迟变量),并且还会从解析程序回调中捕获异常。 。

我并不完全明白你在第二部分问题中想要表达的内容,但你可以减少两个服务电话只是:

report.getAllReport=function(prd){
    $log.log(prd.periodType);
    return $http.post(URLs.AllReportURL,prd);
}