Я думаю, вы задаете два разных вопроса. Один вопрос о том, как ждать, пока элемент станет DOM, и другой вопрос о том, как асинхронные действия работают в JavaScript.
Для ожидания отображения элемента DOM, самое простое решение (на мой взгляд)чтобы создать цикл while
и разорвать его, как только элемент существует:
// NOTE: this code isn't tested nor I have tried to see if it works
let elem = document.querySelector('.someSelector');
while(!elem) {
elem = document.querySelector('.someSelector');
}
// do something else when the element shows
Имейте в виду, что это может вызвать проблемы с утечкой памяти.
Я ожидал напечатать 1, 2и через три секунды 3.
Ваше ожидание неверно. Способ работы setTimeout
состоит в том, что он добавляет вашу функцию обратного вызова в отдельный стек и вызывает ее по истечении заданного вами количества миллисекунд. Если вы хотите показать три через 3 секунды, вам нужно будет сделать:
function test() {
console.log('1');
console.log('2');
setTimeout(function() {
console.log('3');
}, 3000);
}
Или использовать async / await
async function test() {
console.log('1');
console.log('2');
await new Promise(resolve => {
setTimeout(resolve, 3000);
});
console.log('3');
}