AngularJS, как выполнить код только после того, как обещание разрешено? (с прямоугольным)

Это может быть нубский вопрос, но я до сих пор не смог разобраться с промисами и, в частности, с тем, как писать с ними код. (Я прочитал несколько статей, но большинство из них абстрактны, и я просто не написал достаточно, чтобы иметь четкую картину) У меня есть приложение AngujlarJS, которое получает данные через http-запрос на другой сервер, который сначала отправляет обещание . Мне удалось получить ответ от обещания и использовать его в своем приложении. Однако, потому что мой код плохо написан. Он выполняет другой код до того, как обещание будет разрешено, что приведет к проблемам. Он начинает загружать страницу до того, как на ней появятся данные.

что у меня есть:

var userTotals = *http request which returns a promise

$scope.data = userTotals.$object

//code that does someting with $scope.data

Что мне нужно (я думаю)

var userTotals = *http request which returns a promise

$scope.data = userTotals.$object.
  beforethisresolves(function{ 
     show fancy loading icon or something })
  .whenthis resolves(function{
    //code that does someting with $scope.data
  }

однако я не могу понять синтаксис правильно.


person Mischa    schedule 29.05.2015    source источник
comment
HTTP-запрос возвращает promise, у вас есть then https://docs.angularjs.org/api/ng/service/$http   -  person Avraam Mavridis    schedule 29.05.2015


Ответы (2)


Вот как это выглядит в целом:

var promise = $http.post('/url');

console.log('Request started');

promise.then(function(result) {
  console.log('Success');
  console.log(result);
}, function() {
  console.log('Failure');
});

На самом деле помогла $q документация AngularJS. мне много, чтобы понять концепцию обещаний.

Надеюсь это поможет!

person SkyWriter    schedule 29.05.2015
comment
спасибо, это именно то, что мне было нужно. я также проверю документацию. - person Mischa; 29.05.2015

Предполагая, что вы используете модальный режим Bootstrap, вы можете сделать следующее:

function openModalWithProgressIndicator(deferred) {
  const progressModal = $uibModal.open({
    templateUrl: 'templates/modals/progress.html',
    backdrop: 'static'
  });
  return deferred.then(function (value) {
    return value;
  }).finally(function () {
    progressModal.close();
  });
}

Аргумент deferred, переданный этой функции, является обещанием. Тем не менее, теперь вы можете сделать следующее:

const deferred = $http.post('http://somewhere/data', {foo: 'bar'});

openModalWithProgressIndicator(deferred)
  .then(function (httpResponse) {
    // do sth with httpResponse.data
  }).catch(function (error) {
    // do sth with error
  });

Итак, главное, на что следует обратить внимание, это обратный вызов finally, который всегда выполняется.

person Daniel Pacak    schedule 04.11.2017