2016-11-23 1 views
0

Я хотел бы использовать обещание и получить доступ к нему через rootScope вместо использования оператора return. Проблема, с которой я сталкиваюсь, заключается в том, что обещание разрешается до того, как мое решение закончится. В приведенном ниже коде successFunction в моем вызове ajax выполняется, прежде чем мой defer.resolve() будет завершен. Есть ли в любом случае я могу получить свой успехFunction ждать до тех пор, пока мой defer.resolve в приложении-директива не будет завершена? Вот мой код:Угловое: назначить и получить доступ через rootScope

приложение-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

Смежные вопросы