Как разрешить обещание внутри Angular $ timeout - PullRequest
0 голосов
/ 03 июля 2018

С обратными вызовами я оборачиваю обратный вызов в блок Angular $ timeout, чтобы он обновлял пользовательский интерфейс.

function makeServerRequest(callback) {
  $timeout(callback);
}

makeServerRequest((response) => {
  $scope.updateUI();
})

Это работает в цикле углового дайджеста, и пользовательский интерфейс обновляется.

Однако это не работает:

function makeServerRequest() {
  return new Promise((resolve, reject) => {
    $timeout(() => {
      resolve();
    });
  })
}

makeServerRequest().then(() => {
  $scope.updateUI();
})

В этом случае кажется, что разрешение происходит, и затем $scope.updateUI(); вызывается по истечении времени ожидания.

Как я могу обернуть resolve в тайм-аут, чтобы внешний таймер вызывался внутри тайм-аута?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Что вам нужно сделать, это создать обещание $ q из API запроса сервера:

function makeServerRequest() {
  return $q((resolve, reject) => {
     var callback = resolve;
     ServerRequest(callback);
  });  
}

makeServerRequest().then(() => {
  $scope.updateUI();
})

Нет необходимости использовать $timeout, поскольку служба $ q интегрирована с платформой AngularJS и ее циклом дайджеста.

Для получения дополнительной информации см. Справочник по API AngularJS $ q - конструктор $ q .

0 голосов
/ 03 июля 2018

Native Promise не вызывает дайджест, в этом случае его следует запускать вручную:

makeServerRequest().then(() => {
  $scope.updateUI();
  $scope.$apply()
})

И $ timeout уже возвращает обещание (обещание $ q, дружественное к дайджесту). Поэтому нет необходимости создавать новый, особенно нативный.

Это может быть:

function makeServerRequest() {
  return $timeout(angular.noop, 100);
}

makeServerRequest().then(...);
...