Search code examples
angularjsmodal-dialoghttprequestangular-uiangular-ui-modal

Close modal dialog programmatically from $http promise


I'm using Bootstrap UI in conjunction with AngularJS to show a modal dialog, while a $http request is processing. Think of it as a wait dialog. I'd like to keep the code as a simple four-liner that I can drop in at various locations like this:

$scope.foobar = function() {
  var waitDialog = $uibModal.open({ templateUrl: 'waitDialog.html' });
  waitDialog.result.catch(function() { /** Rejection ignored */ });

  MyService.doSomething()
  .then(function onSuccess(response) {
    waitDialog.dismiss('Success.');
    // ...
  })
  .catch(function onError(response) {
    waitDialog.dismiss('Failed.');
  });
};

This works fine most of the time, but every now and then the modal dialog does not close programmatically. It remains open, even though the HTTP request returned a result. I've added a close button to the dialog, so users can still dismiss it by calling $dismiss() manually.

I do not understand, however, why the dialog is not always dismissed programmatically. I'm aware of the fact, that $http returns a promise and there might be a delay. But I have debugged the code by printing the waitDialog object to console and it always seems to be both, defined and the identical object. I don't see any scope problems. What am I missing?


Solution

  • You cannot close modal before it is opened, so should be waitDialog.opened.then(() => waitDialog.dismiss())