- From: Mattias Buelens <notifications@github.com>
- Date: Tue, 26 Apr 2022 14:16:31 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1229/1110256873@github.com>
This happens because the writable stream is not yet [started](https://streams.spec.whatwg.org/commit-snapshots/e9355ce79925947e8eb496563d599c329769d315/#writablestreamdefaultcontroller-started). If you add a delay before you call abort and cancel, you get the events in the expected order:
```javascript
promise_test(async t => {
const events = [];
const rs = new ReadableStream({
pull(controller) {
controller.error('failed to abort');
},
cancel() {
events.push('cancel');
return Promise.reject(error1);
}
}, { highWaterMark: 0 });
const ws = new WritableStream({
abort() {
events.push('abort');
return Promise.reject(error2);
}
});
await flushAsyncEvents(); // <<< the important bit
await promise_rejects_exactly(t, error2, Promise.all([ws.abort(), rs.cancel()]), 'The abort rejection happens first in this case');
assert_array_equals(events, ['abort', 'cancel'], 'abort() is called first in this case');
}, '#1229');
```
I agree that this is surprising: we don't wait for the readable stream to be started before we call its `cancel` method. But there's a reason for this: the `start()` method may a long-running async producer.
```javascript
let abortController = new AbortController();
const rs = new ReadableStream({
async start(controller) {
while (!abortController.signal.aborted) {
controller.enqueue("a");
await new Promise(r => setTimeout(r, 1000));
}
},
cancel(reason) {
controller.abort(reason);
}
});
```
See also https://github.com/whatwg/streams/pull/1208#discussion_r793942484.
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/issues/1229#issuecomment-1110256873
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/streams/issues/1229/1110256873@github.com>
Received on Tuesday, 26 April 2022 21:16:43 UTC