- From: Andy Edwards <notifications@github.com>
- Date: Mon, 28 Oct 2024 18:12:10 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
Received on Tuesday, 29 October 2024 01:12:14 UTC
@domenic it's basically unsafe to use async iteration on anything that acquires resources, unless you do something like wrap it with `abortableAsyncIterator`:
```ts
const abortable = <T,>(promise: Promise<T>): Promise<T> =>
Promise.race([promise, this.abortedPromise as Promise<T>])
const abortableAsyncIterable = <T,>(
iter: AsyncIterable<T>
): AsyncIterable<T> => ({
[Symbol.asyncIterator]: () => {
const inner = iter[Symbol.asyncIterator]()
return {
next: () => abortable(inner.next()),
return: inner.return,
throw: inner.throw,
}
},
})
```
I think this should be a builtin function or even special syntax like
```ts
for await (const elem of asyncIterable until signal) {
...
}
```
Because it's easy to forget that we'll leak resources without doing this, and I'm sure a lot of JS developers don't even realize it.
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/issues/1255#issuecomment-2442964298
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/streams/issues/1255/2442964298@github.com>
Received on Tuesday, 29 October 2024 01:12:14 UTC