@exxxt4zy

Как предотвратить бесконечную загрузку страницы при отправке post запроса?

Как сделать так, чтобы при отправке post запроса в функцию, в которой есть цикл страница не дожидалась окончания цикла и обновлялся счетчик отправленных сообщений? Читал, что нужно использовать ajax, но так и не разобрался как написать лучше.

general.go

if r.Method == http.MethodPost {
           for i, number := range numbers[:messageCount] {
			err := utils.SendMessage(session, number, message)
			if err != nil {
				log.Fatalf("Error while sending message: %s\n", err)
			} else {
				logMessage := fmt.Sprintf("%d. Отправлено сообщение: [%s - %s]", i, number, sessionName)
				fmt.Println(logMessage)
				sleepTime := time.Duration(delay) * time.Second
				time.Sleep(sleepTime)
			}
		}
}

index.html

<form action="/send_messages" method="post">
...
<button type="submit" class="btn btn-primary">Запустить</button>
</form>
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
NikFaraday
@NikFaraday
Student full-stack Developer
Ну... Вот структура ajax скрипта для post запроса (Только вам нужно сначала ещё подключить jQuery, потому что ajax является частью библиотеки jQuery):

let data = { prop: value }
let jsonData = JSON.stringify(data)

$.ajax({
     url: 'https://domain.com/route/to/endpoint/',
     method: 'post',
     data: jsonData,
     dataType: 'json',
     contentType: 'application/json; charset=utf-8',
     success: (response) = { console.log(response) }, // catch Ok
     error: (response) => { console.log(response) } // catch other (BadRequest, NotFound e.t.c)
})


Этот скрипт будет выполняться асинхронно и пользователю не придётся ждать его завершения, а когда запрос будет выполнен, вы сможете его обработать в блоках success и error
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@calculator212
обновлялся счетчик отправленных сообщений
Нужно отдельное API которое будет возвращать тебе значение счетчика для текущего чата, например по id чата. На стороне клиента нужно использовать js, сейчас обычно используют fetch реже XHR, соотвественно в js тебе нужно будет запустить фоновый процесс который будет опрашивать сервер раз в секунду например и обновлять счетчик
Ответ написан
Комментировать
Использовать SSE (Server Sent Events). Это на порядок проще, чем вебсокеты, но мощь практически такая же.
Вот неплохая статья на английском.
https://blog.stackademic.com/real-time-communicati...

Кстати, библиотека HTMX позволяет это обрабатывать и без написания Javascript
https://htmx.org/extensions/server-sent-events/
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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