Поток API с извлечением в реактивном родном приложении - PullRequest
1 голос
/ 19 мая 2019

Я пытался использовать Stream api с fetch в приложенииact-native, я реализовал его с помощью замечательного примера, упомянутого на jeakearchibald.com . код похож на: -

fetch('https://html.spec.whatwg.org/').then(function(response) {
  console.log('response::-', response)
  var reader = response.body.getReader();
  var bytesReceived = 0;

  reader.read().then(function processResult(result) {
    if (result.done) {
      console.log("Fetch complete");
      return;
    }
    bytesReceived += result.value.length;
    console.log(`Received ${bytesReceived} bytes of data so far`);

    return reader.read().then(processResult);
  });
});

Ссылка на API потока: -

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

Но, похоже, реализация fetch-native немного отличается от браузеров, и не так просто использовать Stream так же, как в Интернете.

Уже существует нерешенная проблема по реакции-нативной для того же https://github.com/facebook/react-native/issues/12912

В Интернете мы можем получить доступ к Stream из response.body.getReader () , где response - это просто обычный результат, перенастроенный из вызова fetch для URL потока, но в реакции-нативе мы не можем получить доступ body и, следовательно, getReader из ответа на вызов fetch.

Поэтому, чтобы преодолеть это, я попытался использовать пакет rn-fetch-blob npm , потому что он поддерживает потоки, но кажется, что он поддерживает только пути к файлам локали, потому что функции readStream, похоже, не поддерживают У меня есть поддержка для передачи Авторизации и других необходимых заголовков, поэтому я попытался использовать RNFetchBlob.fetch с удаленным URL-адресом и необходимыми заголовками, а затем с помощью метода readStream из ответа, но это всегда возвращает меня, поскольку поток с текущим ответом отсутствует.

RNFetchBlob.fetch('GET', 'https://html.spec.whatwg.org/')
      .progress((received, total) => {
        console.log('progress', received / total);
      })
      .then((resp) => {
        // const path = resp.path();
        console.log('resp success:-', resp);
        RNFetchBlob.fs.readStream(path, 'utf8').then((stream) => {
          let data = '';
          stream.open();
          stream.onData((chunk) => {
            data += chunk;
          });
          stream.onEnd(() => {
            console.log('readStream::-', data);
          });
        // });
      })
      .catch((err) => {
        console.log('trackAppointmentStatus::-', err);
      });

Возможно, я делаю что-то не так в обоих своих подходах, поэтому в будущем мне или кому-то еще может помочь небольшое руководство. Или мне может понадобиться найти способ сделать это изначально с помощью написания моста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...