У нас есть служба клиент\сервер REST API. В конкретном почтовом запросе сервер должен начать длительную операцию, а клиент должен ждать и получать уведомление о ходе выполнения, пока операция не будет выполнена. Уведомление о ходе выполнения представляет собой простое сообщение в виде строки json, которое должно быть видно пользователю сразу после его отправки сервером.
Сервер отправляет фрагментированные строки JSON во время операции.
Как я должен реагировать на полученные фрагментированные данные (из почтового запроса) сразу после их прибытия? Я использую Angular 6 и пробовал разные методы, но безуспешно.
Я попытался установить для параметра httpClient «reportProgress» значение true, он просто разделяет ответ на разные отчеты о ходе выполнения, но по-прежнему собирает все фрагменты сервера в один буфер массива.
Я также попытался создать HttpInterceptor, я получил тот же «раздел» ответа, но не фактические фрагменты сервера.
I have tried to set the httpClient option "reportProgress" to true, it just splits the response to different progress reports, but it still collects all the server chunks to single array buffer.
Это встроено в базовый вызов XHR (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType). В Firefox есть настраиваемый тип ответа (moz-chunked-arraybuffer
), но не существует стандартного способа получения подобного фрагментированного ответа.
Браузеры поддерживают загрузку файлов, которые на самом деле не доступны через JS, но будут потоковыми. В противном случае вам нужно загрузить все содержимое в память.
Существуют также такие решения, как веб-сокеты, события, отправленные сервером, разбиение вызова на несколько кратковременных вызовов и т. д., но все они потребуют изменений на стороне сервера.
Также актуально: https://github.com/angular/angular/issues/26289
Я разбираюсь: Используя XMLHttpRequest, зарегистрируйтесь в событиях прогресса и установите тип содержимого в коде узла сервера: text/jason. События выполнения запускаются для данных каждого фрагмента сервера.
Можете объяснить логику пользовательского интерфейса для этого ??