Как предотвратить бесконечную загрузку страницы при отправке 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: %sn", err) } else { logMessage := fmt.Sprintf("%d. Отправлено сообщение: [%s - %s]", i, number, sessionName) fmt.Println(logMessage) sleepTime := time.Duration(delay) * time.Second time.Sleep(sleepTime) } } } |
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: %sn", 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> |
<form action="/send_messages" method="post"> ... <button type="submit" class="btn btn-primary">Запустить</button> </form>
Дополнительно:
Вынести медленный фоновый процесс отправки сообщений в очередь, которая разгребается в отдельной горутине в фоне.
time.Sleep(sleepTime)
- может в вашем случае достаточно будет
Ну... Вот структура 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) }) |
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
- ради одного запроса ставить жквери это как минимум странно. Фетч в 3 строчки достаточно.
- ThunderCat, ну, я не могу сказать, использует ли этот человек один запрос или много. fetch однозначно будет проще использовать, но я привёл пример с jquery ¯_(ツ)_/¯
- Nik Faraday, использовал fetch, получилось.
Ответы:
обновлялся счетчик отправленных сообщений
Нужно отдельное 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/
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для предотвращения бесконечной загрузки страницы при отправке POST запроса, можно использовать несколько методов:
1. Установить тайм-аут: Вы можете установить тайм-аут для запроса, чтобы ограничить время ожидания ответа. Например, в PHP вы можете использовать функцию `set_time_limit()` для установки максимального времени выполнения скрипта.
```php
set_time_limit(30); // Устанавливаем тайм-аут в 30 секунд
```
2. Проверить статус загрузки: При отправке POST запроса, можно проверить статус загрузки и прервать выполнение запроса, если он занимает слишком много времени. Например, в JavaScript вы можете использовать объект `XMLHttpRequest` для отправки запроса и проверки его статуса.
```php
// Создаем новый объект XMLHttpRequest var xhr = new XMLHttpRequest(); // Устанавливаем обработчик события onreadystatechange xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { // Обработка успешного ответа } else if (xhr.readyState == 4 && xhr.status != 200) { // Обработка ошибки } }; // Отправляем POST запрос xhr.open("POST", "обработчик.php", true); xhr.send();
```
3. Оптимизировать запрос: Проверьте ваш код на наличие лишних операций или запросов, которые могут замедлить загрузку страницы. Попробуйте оптимизировать ваш код и уменьшить количество запросов к серверу.
Надеюсь, что эти советы помогут вам предотвратить бесконечную загрузку страницы при отправке POST запроса. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.