Есть топорный вариант. Сделай универсальный класс "действие" с интерфейсами isReady и do. Например если существует какой-то нужный элемент то isReady возвращает true, в do пишешь функцию что действие должно сделать. Сделай пул действий. Луп с таймаутом периодически проверяет первое действие из списка, если ready то делает do, потом переходит к следующему и так пока всё не закончится.
Что-то подобное я делал еще более деревянным способом:
state = 1;
ready = false;
function doSomething() {
switch (state) {
case 1:
// Нажали на кнопку
state = 2;
ready = false;
case 2:
if (ready) {
state = 3;
} else {
setTimeout(wait, 200) // Ждем появления на странице дополнительного интерфейса
}
...
}
setTimeout(doSomething, 500);
}
function wait() {
if () { // Проверка, появился ли на странице новый интерфейс
ready = true
} else {
setTimeout(wait, 200)
}
}