Я взаимодействую с веб-страницей, на которой некоторые из более глубоких вложенных элементов в подкадрах загружаются даже после того, как документ готов - т.е. они полагаются на ожидающие запросы ajax / api, которые еще не завершены при загрузке документа.
Мое намерение состоит в том, чтобы подождать, пока эти элементы существуют, прежде чем что-либо делать с ними. Я могу сделать это, используя setTimeout, и подождать произвольное количество времени, прежде чем делать что-либо, например,
setTimeout(function() {
$("#better_content .binder__toc").append(
"<h4>Experiments</h4><ul><li>This</li><li>is</li><li>a</li><li>test</li></ul>"
);
}, 5000);
Однако было бы неплохо рекурсивным и асинхронным (неблокирующим) способом продолжать проверять указанный элемент. ("#better_content .binder__to c") до тех пор, пока значение undefined или null не будет возвращено, т.е. элемент существует. Я пытался сделать это с помощью обещаний. Простой пример со счетчиком выглядит следующим образом:
static waitForElement = counter => {
counter++
return new Promise((res, rej) => {
if (counter < 5) {
this.waitForElement(counter)
.then(function() {
res("complete");
})
.catch(rej);
}
res("complete");
});
};
this.waitForElement(counter)
.then(a => console.log(a))
.catch(a => console.log(a));
Вышеприведенное решение успешно разрешено и выглядит неблокирующим. Однако, если я заменим счетчик для селектора элемента, как показано ниже:
static waitForElement = selector => {
let found = $(document).find(selector)[0];
console.log(found);
return new Promise((res, rej) => {
if (found === undefined) {
this.waitForElement(selector)
.then(function() {
res("found");
})
.catch(rej);
}
res("found");
});
};
this.waitForElement("#better_content .binder__toc")
.then(a => {
console.log(a);
$("#better_content .binder__toc").append(
"<h4>Experiments</h4><ul><li>This</li><li>is</li><li>a</li><li>test</li></ul>"
);
})
.catch(a => console.log(a));
Тогда это, кажется, никогда не решится успешно и действительно замедляет веб-страницу - я предполагаю, что она все еще блокирует основной поток.
Любые предложения о том, как я могу исправить или понять, что здесь происходит, будут более чем приветствоваться.