如何使用$q从 angularJS 中的$broastcast获得承诺



现在我的控制器代码如下所示:

$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.open回调的问题,但我不得不破解它。我仍在努力正确使用$q,我的代码变得越来越混乱。

你的控制器代码看起来不错,它应该按预期工作,你只是不需要在你的第一个then()中延迟对象:

$scope.spAPI.load(id).then(function(result){
  if(result !== undefined){
    $rootScope.$broadcast("onSpLoaded", result);
  }
}).then(function(success){
  $scope.modalInstance = $modal.open({ ... });

});

这里的原因是$broadcast()是同步操作,当$broadcast()返回时,所有事件处理程序都将被调用;而第 2 个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));
    });
});

相关内容

  • 没有找到相关文章

最新更新