- From: Mattias Buelens <notifications@github.com>
- Date: Wed, 07 Feb 2024 15:13:36 -0800
- To: whatwg/webidl <webidl@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/webidl/pull/1387@github.com>
@yuki3 found [an interesting edge case](https://chromium-review.googlesource.com/c/chromium/src/+/5263418/6#message-d786cceaee26217e9a67d9201f5e10d1c0c4a34e) related to async iterators.
In Firefox and Node.js (where async iteration on `ReadableStream` is already supported), when you run this snippet:
```js
const readable = new ReadableStream({
start(c) {
c.enqueue("a");
c.enqueue("b");
},
cancel() {
console.warn("cancelled");
}
});
const it = readable.values();
const p1 = it.next().then(x => console.log("next 1 resolved with", x));
const p2 = it.return().then(x => console.log("return resolved with", x));
const p3 = it.next().then(x => console.log("next 2 resolved with", x));
```
you get:
```
next 1 resolved with { value: 'a', done: false }
cancelled
next 2 resolved with { done: true, value: undefined }
return resolved with { done: true, value: undefined }
```
This is quite surprising: the second `next()` call resolves *before* the `return()` call, even though it was called *after* `return()`. Intuitively, we would expect all async iterator calls to get queued. Indeed, if you do the same thing with an async generator:
```js
async function* test() {
try {
yield "a";
yield "b";
} finally {
console.warn("cancelled");
}
}
const it = test();
const p1 = it.next().then(x => console.log("next 1 resolved with", x));
const p2 = it.return().then(x => console.log("return resolved with", x));
const p3 = it.next().then(x => console.log("next 2 resolved with", x));
```
you get the results in the same order as they were called:
```
next 1 resolved with { value: 'a', done: false }
cancelled
return resolved with { value: undefined, done: true }
next 2 resolved with { value: undefined, done: true }
```
Yuki and I believe this to be a bug in the Web IDL specification. More precisely, the `return()` method should update the ongoing promise, such that future calls to `next()` and `return()` are properly chained. This aligns more closely with the behavior of async generators.
---
- [ ] At least two implementers are interested (and none opposed):
* …
* …
- [ ] [Tests](https://github.com/web-platform-tests/wpt) are written and can be reviewed and commented upon at:
* … <!-- If these tests are tentative, link a PR to make them non-tentative. -->
- [ ] [Implementation bugs](https://github.com/whatwg/meta/blob/main/MAINTAINERS.md#handling-pull-requests) are filed:
* Chromium: …
* Gecko: …
* WebKit: …
* Deno: …
* Node.js: …
* webidl2.js: …
* widlparser: …
- [ ] [MDN issue](https://github.com/whatwg/meta/blob/main/MAINTAINERS.md#handling-pull-requests) is filed: …
- [ ] The top of this comment includes a [clear commit message](https://github.com/whatwg/meta/blob/main/COMMITTING.md) to use. <!-- If you created this PR from a single commit, Github copied its message. Otherwise, you need to add a commit message yourself. -->
(See [WHATWG Working Mode: Changes](https://whatwg.org/working-mode#changes) for more details.)
You can view, comment on, or merge this pull request online at:
https://github.com/whatwg/webidl/pull/1387
-- Commit Summary --
* Update ongoing promise in async iterator return() method
-- File Changes --
M index.bs (12)
-- Patch Links --
https://github.com/whatwg/webidl/pull/1387.patch
https://github.com/whatwg/webidl/pull/1387.diff
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/webidl/pull/1387
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/webidl/pull/1387@github.com>
Received on Wednesday, 7 February 2024 23:13:44 UTC