2016-11-23 58 views
0

我想使用promise并通过rootScope访问它,而不是使用return语句。我遇到的问题是,在我的决心完成之前,承诺已经解决。在下面的代码中,我的ajax调用中的successFunction在defer.resolve()完成之前得到执行。无论如何,我可以让我的成功函数等待,直到我的defer.resolve在app-directive中完成后?这里是我的代码:Angular:通过rootScope分配和访问承诺

APP-directive.js

function(app) { 
    app.directive('spinner', function ($uibModal, $timeout, $q) { 
    return { 
     restrict: 'E', 
     replace: true, 
     template: [ 
      '<div style="display:none;" class="modal-dialog">', 
      '<div class="modal-header ng-scope" style="text-align: center;">', 
      ' {{spinnerMessage}}', 
      '</div>', 
      '<div class="modal-body ng-scope">', 
      ' <img class="spinner-image" ng-src="../../Content/img/spinner.gif" />', 
      '</div>', 
      '</div>' 
     ].join(''), 
     link: function (scope, element) { 
      scope.$watch(function() { 
       return scope.$root.loadMask 
      }, function() { 
       if (scope.$root.loadMask == true) { 
        scope.spinnerModal = $uibModal.open({ 
         template: element[0].innerHTML, 
         size: 'sm', 
         backdrop: 'static', 
         keyboard: 'false' 
        }); 
       } 
       else { 
        var defer = $q.defer(); 
        $timeout(function() { 
         defer.resolve(scope.spinnerModal.close()) 
        }, 3000); 

        scope.$root.spinnerClosed = defer.promise; 
       } 
      }, true); 
} 

ajaxService.js

app.register.service('ajaxService', ['$http', '$rootScope', function ($http, $rootScope) { 
    this.AddUser = function (user, successFunction, errorFunction) { 
     // Initialization 
     $rootScope.loadMask = true; 

     $http.post('Account/AddUser', user) 
     .success(function (response, status, headers, config) { 
      $rootScope.loadMask = false; 
      $rootScope.spinnerClosed.then(function (result) { 
       successFunction(response, status); 
      }); 
     }) 
     .error(function (response, status) { 
      $rootScope.loadMask = false; 
      $rootScope.spinnerClosed.then(function (result) { 
       errorFunction(response, status); 
      }); 
     }); 
    } 

回答

0

我想通了。 AngularJS有一个你使用的.then方法,它基本上是一个回调函数。

$http.post('Account/AddUser', user) 
    .then(
      function successCallback(response) { 
       $rootScope.loadMask = false; 
       successFunction(response, status); 
      }, 
      function failureCallback(response) { 
       $rootScope.loadMask = false; 
       errorFunction(response, status) 
      } 
    ); 
0

AngularJS只要观察者注册执行监听功能,让您的spinnerClosed承诺是可能已经在您的服务上调用this.AddUser时解决。

您可以插入额外的检查,以查看是否将侦听器作为初始化的一部分进行调用。

在向范围注册了一个观察者之后,侦听器fn被异步调用(通过$ evalAsync)来初始化观察者。在极少数情况下,这是不可取的,因为当watchExpression的结果没有改变时调用监听器。要在侦听器fn中检测到这种情况,可以比较newVal和oldVal。如果这两个值相同(===),则由于初始化而调用侦听器。

Angular JS API Reference/$rootScope.Scope