How to use $q to get a promise from a $broastcast in angularJS

旧城冷巷雨未停 提交于 2019-12-13 07:07:35

问题


Right now my controller code looks like this:

$scope.spAPI.load(id).then(function(result){
  var deferred = $q.defer();
  if(result !== undefined){
    deferred.resolve($rootScope.$broadcast("onSpLoaded", result));
  }
  return deferred.promise;
}).then(function(success){

      $scope.modalInstance = $modal.open({ ... });


});

I want the modal instance to be opened AFTER the broadcasts are processed. Is there a way to do this?

Update: I was thinking about this problem backwards. I meant to do the broadcast after the modal instance, anyway, nevermind.

PS: I did have problems with the modalinstance.opened callback though, I had to hack my way around it. I am still struggling to use $q correctly, my code has been getting messier.


回答1:


Your controller code looks fine, it should work as expected, you just don't need the deferred object in your first then():

$scope.spAPI.load(id).then(function(result){

  if(result !== undefined){
    $rootScope.$broadcast("onSpLoaded", result);
  }

}).then(function(success){

  $scope.modalInstance = $modal.open({ ... });


});

The reason here is because $broadcast() is synchronous operation, all the event handlers will have been called when $broadcast() returns; and the function in 2nd then() will only be called after the function in the first then() returns, so $modal.open() will be called after all event handlers.

DEMO

Update:

You know that $scope.modalInstance.opened is a promise which will be resolved when the modal gets shown, so you can try the following to achieve what you want:

$scope.spAPI.load(id).then(function(result){
    $scope.modalInstance = $modal.open({ ... });

    $scope.modalInstance.opened.then(function() {
        $rootScope.$broadcast("onSpLoaded", result));
    });
});


来源:https://stackoverflow.com/questions/21687410/how-to-use-q-to-get-a-promise-from-a-broastcast-in-angularjs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!