- From: Alex Darby <notifications@github.com>
- Date: Fri, 05 May 2023 06:56:54 -0700
- To: whatwg/fetch <fetch@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/fetch/issues/1651@github.com>
As far as I know, once you've started reading a stream from `response.body` you can't pause and resume it like you can [with node](https://nodejs.org/api/stream.html#event-pause). I think this would be very useful. I've tested this with the below React code sending back a stream of JSON from an app I'm running locally. I thought that if I used `sleep` in a blocking way it would stop the reader from reading but I noticed that it keeps reading in the background. Perhaps I've made a mistake here and there is a way to achieve this in pure JS, I'd be really grateful for an example of that if so! ```javascript import logo from "./logo.svg"; import "./App.css"; function App() { let pause = false; let cancel = false; function changePause() { pause = !pause; } function cancelStream() { cancel = true; } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function* iterateOverStream(stream) { const reader = stream.getReader(); const decoder = new TextDecoder(); while (true) { if (pause) { // Slow down the infinite loop repeating until pause is pressed again // I thought that this would pause the reader from reading but it doesn't // it just pauses displaying the data, the reader keeps reading in the background await sleep( 3 * 1000); continue; } else { const { done, value } = await reader.read(); if (done) break; yield decoder.decode(value, { stream: !done }); if (cancel) { reader.cancel(); break; } } } reader.releaseLock(); } async function readData() { cancel = false; const response = await fetch("http://localhost:5000"); for await (const chunk of iterateOverStream(response.body)) { console.log(`json chunk is ${chunk}`); } } return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p onClick={readData}> Click me and check out dev tools to test stream </p> <p onClick={changePause}>Click to pause/unpause</p> <p onClick={cancelStream}>Click to cancel stream</p> </header> </div> ); } export default App; ``` -- Reply to this email directly or view it on GitHub: https://github.com/whatwg/fetch/issues/1651 You are receiving this because you are subscribed to this thread. Message ID: <whatwg/fetch/issues/1651@github.com>
Received on Friday, 5 May 2023 13:56:59 UTC