AngularJS deferred 和 promise 的可重用性

AngularJS Reusability with deferred and promise

我是使用 deferred promise 的初学者,无法找到我遇到的问题的确切答案。

控制器:类似的方法,但我需要有不同的承诺。

$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);
}