@AlexAlex132

Как дождаться выполнения промиса?

Здравствуйте. Пишу пользовательский скрипт для tampermonkey, который должен повесить на одну из кнопок на сайте Event Listener "click". При нажатии на эту кнопку, должно запуститься выполнение промиса, которое может занимать несколько секунд. Вот, как это выглядит:
$(document).ready(function() {
    document.getElementsByClassName("btn submit")[0].addEventListener("click", () => {
        data.send("...") // <-- промис, на выполнение которого требуется несколько секунд.
    })
})

Всё бы ничего, но есть одна проблема - на эту кнопку разработчики сайта установили такой же Event Listener "click", только он вызывает редирект на другую страницу сайта по нажатию.

В чём проблема: т.к мой промис требует какое-то время на выполнение, он может не успеть завершиться до редиректа, и соответственно, результата в таком случае никакого не будет.

Вопрос: каким образом можно приостановить все процессы на сайте (включая редирект), пока не выполнится мой промис?
  • Вопрос задан
  • 194 просмотра
Пригласить эксперта
Ответы на вопрос 4
@denis-chenykh
Прочтите как работает async await
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
а как выглядит этот твой "btn submit"? какая у него верстка?
если внутри него есть дочерний элемент, то повесь "click" на этот чилд и вызывай e.stopPropagation(), тогда клик не дойдет до кнопки

либо же придется чем-то накрыть кнопку сверху. В общем, надо смотреть как там сделано.
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
попробуйте заморозить локейшн, чтобы ни один редирект не проскочил:
Object.freeze(location);

Upd. раз хочется, чтобы всё-таки отработал и оригинальный клик с редиректом, можно так:
  1. повесить свой слушатель клика, в котором останавливать событие клика. Т.к. наш слушатель позже — он переиграет исходный слушатель разработчиков.
  2. после отрабатывания нашего долгого скрипта, удалить свой слушатель, и снова вызвать событие клика на кнопке — теперь его отловит оригинал с редиректом.


Ответ написан
FFxSquall
@FFxSquall
Могу писать код, могу не писать
Не совсем понятно, что у вас происходит в промисе и какого результата вы хотите. Если это отправка каких-то данных на ваш сервер и редирект её прерывает, тогда используйте sendBeacon
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы