Дайджест англоязычных изданий не ждет обещаний
Я хочу иметь функцию, которая возвращает обещание, которое разрешается при загрузке 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
прослушиватель события добавляется после того, как событие не запускается.