[AngularJS]角︰ 从控制器内服务访问的承诺

发布时间: 2017/4/16 20:54:49
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我在我有几个步骤的应用程序中使用的 API:

  1. 从 API 1 加载完整的数据
  2. 获取一些数据并使用,使下一个 API 调用的参数
  3. 一个取得了 API 调用,使 nvd3 图表 (通过指令)

控制器︰

$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:

使用以下代码︰

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

deferred对象本身不是一个承诺,因此它不具有所需的方法。你应该访问的承诺对象︰ 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 

        })
      }
    }

 }])
官方微信
官方QQ群
31647020