Дайджест англоязычных изданий не ждет обещаний

Я хочу иметь функцию, которая возвращает обещание, которое разрешается при загрузке DOM:

function waitForDom() {
  return $q((resolve) => {
    $window.addEventListener('DOMContentLoaded', () => {
      resolve("yay, i've loaded");
    });
  })
})

Это прекрасно работает в браузере. Однако, когда я пытаюсь проверить его, тест никогда не заканчивается, так как это обещание никогда не разрешается:

it('some test', (done) => inject(($window, $q, $rootScope) => {
  waitForDom()
    .then(it => expect(it).toBe("yay, i've loaded"))
    .then(done);

  $rootScope.$digest();
}));

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

Я пытался положить resolve() внутри $scope.$apply(), но я получаю "$digest уже выполняется".

Я пытался положить $digest внутри setTimeout и это дает мне уже готовый дайджест, в котором я действительно запутался. Но это не совсем проблема.

TLDR Как мне закончить тест?

редактировать

Хотя я могу обойти вышеупомянутый пример, я ищу общее решение, когда вы разрешаете обещание внутри тела прослушивателя событий DOM, например:

function appendIframe() {
  return $q((resolve) => {
    const iframe = $window.document.createElement('iframe');
    const iframeParent = $window.document.body;

    iframe.src = authUrl;

    iframe.onload = function() {
      resolve('iframe loaded')
    };

    iframeParent.appendChild(iframe);
  });
})

И нет, делать это с помощью jqlite не имеет значения.

1 ответ

Используйте angular.element:

function waitForDom() {
  return $q((resolve) => {
    angular.element( () => {
      resolve("yay, i've loaded");
    });
  })
})

Из документов:

Большинство браузеров предоставляют аналогичную функциональность в форме DOMContentLoaded событие. Однако метод.ready() в jQuery отличается важным и полезным способом: если DOM становится готовым и браузер запускается DOMContentLoaded до того, как код вызовет.ready (обработчик), обработчик функции все равно будет выполнен. В отличие от DOMContentLoaded прослушиватель события добавляется после того, как событие не запускается.

Другие вопросы по тегам