Но, как ни странно, «решено» регистрируется.
...
Почему это
waitForEl
называется «рекурсивно» (оно планирует вызов сам через setTimeout
). Каждый вызов waitForEl
создает обещание, поэтому вы создаете несколько обещаний. «Разрешение», которое вы видите в консоли, происходит от одного из этих обещаний. Вы также должны увидеть одно или несколько сообщений 'reject'.
Проблема в том, что обещание "parent" / "top" никогда не разрешается, потому что здесь ничего не делается с возвращаемым значением:
waitForEl(selector)
Функция возвращает обещание, но вы ничего с ним не делаете, поэтому никогда не разрешаете обещание, вызвавшее эту функцию.
Простое решение будет
waitForEl(selector).then(resolve)
Но это также означает, что вы создаете обещания рекурсивно. Кажется, нет необходимости делать это. Просто определите простую функцию внутри обещания, которое вызывает само себя:
function waitForEl(selector) {
return new Promise(resolve => {
console.log(selector)
(function check()
if (document.querySelector(selector)) {
console.log('resolved')
resolve('resolved')
} else {
console.log('rejected')
setTimeout(check, 100);
}
}());
})
}
Вы все равно должны добавить некоторое условие, которое через некоторое время отклонит обещание, чтобы оно не вызывало setTimeout
навсегда.