Возврат нескольких асинхронных ответов - PullRequest
0 голосов
/ 14 мая 2018

В настоящее время я хочу настроить конечную точку, которая принимает запрос и возвращает данные ответа с шагом по мере их загрузки.

Применение этого в том, что при одной загрузке данных я хотел бы рассчитать количество различных метрик для этих данных. Поскольку каждая метрика рассчитывается асинхронно, я хочу вернуть значение этой метрики во внешний интерфейс для визуализации.

Для тестирования мой контроллер выглядит следующим образом, пытаясь использовать res.write

uploadData = (req, res) => {
   res.write("test");
   setTimeout(() => {
       res.write("test 2");
       res.end();
   }, 3000);
}

Однако, я думаю, что проблема связана с моей клиентской стороной, которую я пишу в React-Redux, и вызываю этот маршрут через вызов Axios. Насколько я понимаю, это потому, что запрос axios закрывается после получения первого ответа, а соединение не остается открытым. Вот как выглядит мой аксиос-вызов:

axios.post('/api', data)
  .then((response) => {
      console.log(response);
  })
  .catch((error) => {
       console.log(error);
  });

Есть ли простой способ сделать это? Я также думал о потоковой передаче, однако моя проблема с потоковой передачей заключается в том, что я хотел бы, чтобы каждое соединение было прямым и уникальным для клиентов, которые открыты в течение короткого промежутка времени (т. Е. Открываются только при расчете метрик).

Я должен также упомянуть, что загружаемый ресурс - это дБ, и я хотел бы избегать синтаксического анализа и открытия соединения несколько раз в результате нескольких конечных точек.

Заранее спасибо, и, пожалуйста, дайте мне знать, если я могу предоставить больше контекста

1 Ответ

0 голосов
/ 14 мая 2018

Один из способов справиться с этим, все еще используя традиционный API, - хранить метрики в каком-либо объекте, например, в базе данных или в Redis, а затем просто долго опрашивать ресурс.

Для реального мираНапример, предположим, что вы хотите вычислить следующие метрики: foo, время выполнения, длина запроса, бар, панель foobar.

Вы можете создать в хранилище объект, который выглядит следующим образом:

{
  id: 1,
  lengthOfRequest: 123,
 .....
}

тогда вы создадите конечную точку в вашем API, которая будет выглядеть так metrics/{id} и вернет объект.Просто продолжайте звонить по маршруту, пока все не завершится.

Конечно, у этого есть некоторые очевидные недостатки, но как только вы получите достаточно информации, чтобы знать, сколько времени потребуется для выполнения метрики в среднем, вы можете настроить время междузвонки на ваш API.

...