03:17 | <jschoi> | Is there a particular reason why Array.from (https://tc39.es/ecma262/#sec-cma262/#sec-call) seems to call CloseIterator if an error occurs when setting A ’s properties, when there are too many items, and when mapfn throws an error—but not when IteratorStep results in an abrupt completion nor when the iterator depletes its items? |
04:12 | <bakkot> | we don't close the iterator when an error occurs in the iterator itself, because the iterator is broken |
04:12 | <bakkot> | and we don't close iterators when they are depleted in general |
04:13 | <bakkot> | (the assumption is that it does its own cleanup before returning {done: true} ) |
04:13 | <bakkot> | we only call IteratorClose when we need to close an iterator because we can no longer consume it for reasons of our own |
05:19 | <jschoi> | I see. I also see you’ve posted https://github.com/tc39/rationale/issues/2. Thank you for both that and the explanation. |
06:13 | <jschoi> | https://github.com/tc39/proposal-array-from-async/issues/16#issuecomment-995453541 As far as I can tell, there is no way to capture all possible rejections from a sync iterable’s yielded promises, while still maintaining for await semantics. This is correct, right? |
17:54 | <Mathieu Hofman> | What does for await (const foo of iterableYieldingPromises) do in this case? |
17:55 | <Mathieu Hofman> | If I was to implement this in a polyfill, I'd setup a dummy .catch() on the next promise to avoid the unhandled error, but still yield the original promise later |
17:56 | <Mathieu Hofman> | It's a pretty common occurrence when parallelizing async operations |
18:00 | <Mathieu Hofman> | What does |
19:39 | <Mathieu Hofman> | Ugh I wasn't awake, the OP example is flawed, and Async-from-Sync Iterator objects behave correctly |
21:30 | <Mathieu Hofman> | Actually follow up on Async-from-Sync Iterator objects / for await of. The following IteratorClose behavior seem surprising to me:
for await of however doesn't close the iterator
|
21:52 | <Ashley Claymore 🤒> | At least the solution for this particular example is a one keyword change to async function * gen() { |
21:52 | <Ashley Claymore 🤒> | though I was surprised there was a difference |
21:53 | <Mathieu Hofman> | sure, but then that iterator is async and can no longer be used with sync iteration |
21:54 | <Ashley Claymore 🤒> | good point :) |
21:55 | <Ashley Claymore 🤒> | Would it be possible to change this, or working-as-intended/too-late-to-change |
21:58 | <Mathieu Hofman> | I'm not sure, there is other behavior with IteratorClose I find strange, like the swallowing of errors in return if the iterator was closed by a for-of loop that threw, which is kinda the opposite of finally errors shadowing try errors |
22:04 | <Mathieu Hofman> | Wondering if something can be done in step 10 of AsyncFromSyncIteratorContinuation |
22:06 | <Mathieu Hofman> | like close the sync iterable on wrapper value rejection since rejecting the next call will cause consumers of the async iterable to bail from ever touching the async iterable again |