Я пытался использовать 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);
});
Возможно, я делаю что-то не так в обоих своих подходах, поэтому в будущем мне или кому-то еще может помочь небольшое руководство. Или мне может понадобиться найти способ сделать это изначально с помощью написания моста.