Как использовать $q для получения обещания от трансляции $broadcast в angularJS

Прямо сейчас мой код контроллера выглядит так:

$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({ ... });


});

Я хочу, чтобы модальный экземпляр открывался ПОСЛЕ обработки трансляций. Есть ли способ сделать это?

Обновление: я думал об этой проблеме в обратном направлении. В любом случае, я хотел сделать трансляцию после модального экземпляра, неважно.

PS: у меня действительно были проблемы с обратным вызовом modalinstance.opened, мне пришлось взломать его. Я все еще пытаюсь правильно использовать $q, мой код становится все более запутанным.


person Alex C    schedule 10.02.2014    source источник
comment
Ваш код выглядит нормально, он должен делать то, что вы хотите. поскольку $broadcast() является синхронной операцией, все обработчики событий должны вызываться при возврате $broadcast()   -  person Ye Liu    schedule 11.02.2014


Ответы (1)


Код вашего контроллера выглядит нормально, он должен работать, как и ожидалось, вам просто не нужен отложенный объект в вашем первом then():

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

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

}).then(function(success){

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


});

Причина здесь в том, что поскольку $broadcast() является синхронной операцией, все обработчики событий будут вызваны, когда $broadcast() вернется; и функция во втором then() будет вызываться только после возврата функции в первом then(), поэтому $modal.open() будет вызываться после всех обработчиков событий.

ДЕМО

Обновлять:

Вы знаете, что $scope.modalInstance.opened — это обещание, которое будет разрешено при отображении модального окна, поэтому вы можете попробовать следующее, чтобы добиться того, чего хотите:

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

    $scope.modalInstance.opened.then(function() {
        $rootScope.$broadcast("onSpLoaded", result));
    });
});
person Ye Liu    schedule 10.02.2014
comment
Я обновил свой вопрос. Я просто не правильно думал о своей проблеме. Все еще изучаю эту штуку с $q. :) - person Alex C; 12.02.2014
comment
plnkr.co/edit/Nbe4af6pWIGtys1Jt8Fz?p=preview — пытался, но не работает с обещаниями - person jantimon; 02.06.2015