Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.06.2023, 23:01
Интересующийся
Отправить личное сообщение для JobLack Посмотреть профиль Найти все сообщения от JobLack
 
Регистрация: 08.06.2017
Сообщений: 24

Как получать статус процесса с бекенда
Друзья, на бекенде (Node JS) выполняется весьма длительный процесс обработки данных. Как на фронтенде (React) в течение этого процесса показывать не только спиннер, но и прогресс бар с процентом завершения процесса. Другими словами как "заставить" бекенд переодически возвращать статус процесса еще до его завершения?
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 19.06.2023, 00:04
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,561

Есть много разных способов.
Самый примитивный: сделать на сервере эндпоинт типа /progress/<id>, который будет возвращать текущий статус и после запуска долбить этот эндпоинт раз в секунду или типа того.
По сложнее: использовать websocket\Server Sent Events и слать оповещения о прогрессе там.
Не слишком хороший(потому что перезагрузка вкладки всё сломает): не завершать запрос при запуске процесса, а постепенно досылать прогресс в него(типа long polling).
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 19.06.2023, 14:20
Интересующийся
Отправить личное сообщение для JobLack Посмотреть профиль Найти все сообщения от JobLack
 
Регистрация: 08.06.2017
Сообщений: 24

Сообщение от Aetae Посмотреть сообщение
Есть много разных способов.
Самый примитивный: сделать на сервере эндпоинт типа /progress/<id>, который будет возвращать текущий статус и после запуска долбить этот эндпоинт раз в секунду или типа того.
По сложнее: использовать websocket\Server Sent Events и слать оповещения о прогрессе там.
Не слишком хороший(потому что перезагрузка вкладки всё сломает): не завершать запрос при запуске процесса, а постепенно досылать прогресс в него(типа long polling).
Спасибо, действительно попробую в setInterval вставить ендпоинт
Ответить с цитированием
  #4 (permalink)  
Старый 20.06.2023, 13:45
Интересующийся
Отправить личное сообщение для JobLack Посмотреть профиль Найти все сообщения от JobLack
 
Регистрация: 08.06.2017
Сообщений: 24

Сообщение от Aetae Посмотреть сообщение
Есть много разных способов.
Самый примитивный: сделать на сервере эндпоинт типа /progress/<id>, который будет возвращать текущий статус и после запуска долбить этот эндпоинт раз в секунду или типа того.
По сложнее: использовать websocket\Server Sent Events и слать оповещения о прогрессе там.
Не слишком хороший(потому что перезагрузка вкладки всё сломает): не завершать запрос при запуске процесса, а постепенно досылать прогресс в него(типа long polling).
Начал писать ...возникли вопросы...Сам процесс запускается с фронтенда по эндпоинту
router.post("/process", authenticateToken, async (req, res) => {...})
Внутри него в цикле идет обработка JSONа и формирование репорта.
В этом цикле вставил несколько
вызовов функции, в которую передаю процент завершения. (это все в Node)..
Но как из фронтенда получать данные из этой функции. Можно конечно в базу данных писать процент завершения...и отдельным запросом считывать это значение с фронтенда...но это неверно будет неправильно.
Ответить с цитированием
  #5 (permalink)  
Старый 20.06.2023, 15:12
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,561

Если процесс долгий (больше ~30 секунд) - то только так и надо.

Если не такой уж долгий, то можно и как ты сейчас пытаешься.
По современному: так https://developer.mozilla.org/en-US/...adable_streams
По классике: XMLHttpRequest onreadystatechange по readyState === XMLHttpRequest.LOADING читаешь .resposeText.
Ну и можно не слать какие-то конкретные значения, а просто имитировать загрузку(отправляя заранее заданное нужное кол-во байт) и слушать событие progress.
__________________
29375, 35

Последний раз редактировалось Aetae, 20.06.2023 в 15:19.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сравнить время и вывести, в зависимости от времени, статус (день, ночь или вечер) shkarol Javascript под браузер 1 12.11.2022 03:53
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как организовать RichEdit arma Элементы интерфейса 2 18.02.2010 14:57
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20