具有延迟和承诺的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(..
    而不是
    $q.defer
    ,因为显示的构造函数模式具有更好、更简洁的语法(不需要额外的deferred变量),并且还可以捕获解析程序回调中的异常
我不太明白您在问题的第二部分想要表达什么,但您可以将两个服务调用简化为:

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

您已经成功地在代码中执行了两项操作

  • 返回一个
    $q
    承诺本身,您只是将其包装在另一个承诺中
  • 需要时,使用
    $q(..
    而不是
    $q.defer
    ,因为显示的构造函数模式具有更好、更简洁的语法(不需要额外的deferred变量),并且还可以捕获解析程序回调中的异常
我不太明白您在问题的第二部分想要表达什么,但您可以将两个服务调用简化为:

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,这是不同的反模式”并没有反映这些观点,而且非常误导。