Используйте fetch для получения результатов HTTP до конца запроса - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь использовать конечную точку /api/stream сервера Drone 1.0. Эта конечная точка поддерживает соединение HTTP открытым и просто передает новые предстоящие события, чтобы уведомить потребителя о событиях.

Я пытался с этим фрагментом кода, используя JavaScript Fetch API

 await fetch("https://drone.company.com/api/stream/", {
    headers
  })
    .then(function(response) {
      return response.text();
    })
    .then(function(data) {
      console.log(data);
    });

Этот код работает хорошо, но обратный вызов then всегда вызывается после завершения запроса.

Есть ли способ сделать выборку потока тела, полученного во время обработки запроса?

1 Ответ

2 голосов
/ 28 июня 2019

вы можете читать с response.getReader() как

let response = await fetch("https://drone.company.com/api/stream/", {
    headers
  });

const reader = response.body.getReader();

while(true) {
  const {done, value} = await reader.read();

  if (done) {
    break;
  }
  const text = new TextDecoder("utf-8").decode(value);
  console.log(`Received ${text}`)
}

нам нужно использовать TextDecoder, поскольку value содержит данные Uint8Array, а не текст. Не поддерживается IE. fetch не поддерживается Кстати.

на основе https://javascript.info/fetch-progress

...