- From: Mattias Buelens <notifications@github.com>
- Date: Tue, 07 Feb 2023 16:03:56 -0800
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1255/1421672493@github.com>
> 1. What is the "right way" to cancel a stream read during async iteration from a button press?
The easiest way would be to `break` out of the loop. This will call `return()` on the async iterator, which will cancel a `ReadableStream` as [per spec](https://streams.spec.whatwg.org/#rs-asynciterator):
> By default, calling the async iterator’s `return()` method will also [cancel](https://streams.spec.whatwg.org/#cancel-a-readable-stream) the stream. To prevent this, use the stream’s `values()` method, passing true for the [`preventCancel`](https://streams.spec.whatwg.org/#dom-readablestreamiteratoroptions-preventcancel) option.
You can use an `AbortController` for this: check if the signal is aborted in each iteration, and `abort()` when the button is clicked.
```javascript
const controller = new AbortController();
button.addEventListener('click', () => controller.abort());
logChunks(mystream, { signal: controller.signal });
async function logChunks(readableXX, { signal }) {
for await (const chunk of readableXX) {
if (signal.aborted) throw signal.reason;
bytes += chunk.length;
logConsumer( `Chunk: ${chunk}. Read ${bytes} characters.`);
}
}
```
> 2. How are you supposed to handle errors from the source - e.g. a TypeError or a network error or something? I tried putting try/catch around the logChunks() above and various other places but I don't seem to be able to catch them.
Hmm, that's odd. An error *should* cause `next()` to reject, which in turn should make the `for await..of` loop throw. 😕
Could your provide a minimal reproduction case for this?
> 3. What is the recommended way to handle the case of a browser that does not support this feature? Is there a polyfill on the Internet that we should point users to?
Yes, there's [web-streams-polyfill](https://github.com/MattiasBuelens/web-streams-polyfill) and [sd-streams](https://github.com/stardazed/sd-streams).
> 4. Tracking bugs seem to indicate this is not yet in Safari or Chrome. Do you happen to know if Deno/NodeJS support this, and if so, whether it is compatible to the streams spec?
Indeed, there are no browsers that ship an implementation yet. But both [NodeJS](https://nodejs.org/api/webstreams.html#async-iteration) and [Deno](https://deno.land/api@v1.30.3?s=ReadableStream#method__Symbol_asyncIterator__6) already have full support and are fully compliant. 🙂
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/issues/1255#issuecomment-1421672493
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/streams/issues/1255/1421672493@github.com>
Received on Wednesday, 8 February 2023 00:04:09 UTC