Вы можете просто свободно возвращаться из обработчика .then()
. Поскольку стек уже полностью размотан до вызова обработчика .then()
, при повторном вызове driver()
или любой другой функции верхнего уровня, которую вы хотите вызывать из обработчика .then()
, не происходит наращивание стека.
Например, вы можете сделать это:
function driver() {
return clickGetTasksButton().then(() => {
waitForSpinner().then((result) => {
//Script should either accept task or repeat the whole process
if (taskWaiting) {
return processTasks();
} else {
return driver();
}
});
});
}
или немного сгладить:
function driver() {
return clickGetTasksButton().then(waitForSpinner).then(result => {
//Script should either accept task or repeat the whole process
if (taskWaiting) {
return processTasks();
} else {
return driver();
}
});
}
Также обратите внимание, что clickGetTasksButton
не нужно возвращать обещание поскольку это кажется полностью синхронным. Кроме того, вы не можете напрямую позвонить .click()
по результатам document.getElementsByClassName()
. Эта функция возвращает массивоподобный список (объект HTMLCollection
), у которого нет метода .click()
. Я не знаю, намереваетесь ли вы получить первый элемент DOM в этом списке и вызывать .click()
для него или если вы хотите l oop через список, вызывая .click()
для каждого.
И ваш setInterval()
, вероятно, должен использовать немного больший интервал, чем 50 мс. Вы хотите дать несколько циклов самой веб-странице, чтобы сделать свою работу. Вы как бы забиваете это здесь 20 раз в секунду. Я бы сказал, установить его на что-то вроде 200
. И, надеюсь, это не займет много времени для запуска, потому что, если это мобильное устройство, это увеличит время автономной работы и, возможно, даже вытеснит браузер хоста (для экономии заряда батареи).