Angular:从服务中的控制器访问承诺

时间:2016-02-23 06:54:11

标签: javascript angularjs angular-promise

我在我的应用中使用了一个API,其中包含几个步骤:

  1. 从API 1加载完整数据
  2. 获取部分数据并使用它为下一次API调用制作参数
  3. 已进行API调用,制作nvd3图表(通过指令)
  4. 控制器:

    $scope.deferred = $q.defer()
    
    function makeChart(start, finish) {    
      api.getDetail(start, fin).then(function(throughput) {
        $scope.chartData = throughput;
        $scope.deferred.resolve();
      }, function(err) {
         console.log(err);
      })
    }
    
    api.getDetail(id).then(function(job){
      makeChart(job.start, job.finish);
    })
    

    //指令

    .directive('niceChart', [function(){
        return {
            restrict: 'E',
            replace: true,
            template: '<div>Nice Template!</div>',
            link: function (scope, element, attrs) {
            scope.deferred.then(function(){
    
             // Do stuff 
    
            })
          }
        }
    
     }])
    

    当我这样做时,我得到scope.deferred.then is not a function

    我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

使用此代码:

scope.deferred.promise.then(function(){
  // Do stuff 
})

deferred对象本身不是承诺,因此它没有必要的方法。您应该访问promise对象:scope.deferred.promise。

但我建议您将代码重构为以下内容,将promise对象作为参数发送:

var deferred = $q.defer()
$scope.promise = deferred.promise;

function makeChart(start, finish) {    
  api.getDetail(start, fin).then(function(throughput) {
    $scope.chartData = throughput;
    deferred.resolve();
  }, function(err) {
     console.log(err);
  })
}

api.getDetail(id).then(function(job){
  makeChart(job.start, job.finish);
})

////////////////////////////

.directive('niceChart', [function(){
    return {
        restrict: 'E',
        replace: true,
        template: '<div>Nice Template!</div>',
        link: function (scope, element, attrs) {
        scope.promise.then(function(){

         // Do stuff 

        })
      }
    }

 }])