2016-11-23 89 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