Sync iterables and [[asyncIterator]]

herby at mailbox.sk herby at mailbox.sk
Mon Aug 20 09:59:18 UTC 2018



On August 20, 2018 1:46:45 AM GMT+02:00, Gus Caplan <me at gus.host> wrote:
>If you use for-await syntax, the js implementation will internally use
>GetIterator[1] which will look for Symbol.asyncIterator and if it can't
>find it it will return an async wrapper around Symbol.iterator -Gus

Would be nice to have something like Reflect.getAsyncIteratorOf(...), then. Or AsyncIterator.of(...), if something like AsyncIterator exists.
That would do the wrapping of sync ones as well.

>[1]: https://tc39.github.io/ecma262/#sec-getiterator ---- On Sun, 19
>Aug 2018 16:34:27 -0500 Herbert Vojčík <herby at mailbox.sk> wrote ----
>Hello! Lately, I created this in one project: export async function*
>zip (...iterables) { for (const iterators = iterables.map(each =>
>(each[Symbol.iterator] || each[Symbol.asyncIterator]).apply(each)); ;)
>{ const all = await Promise.all(iterators.map(async each => await
>each.next())); if (all.some(each => each.done)) break; yield
>all.map(each => each.value); } } It was sync generator before, but once
>one of the entries became async generator, I changed the zip itself to
>be async. My question is to the pretty ugly const iterators =
>iterables.map(each => (each[Symbol.iterator] ||
>each[Symbol.asyncIterator]).apply(each)) Is there some more idiomatic
>way to find "any iterator; sync or async" / alternatively, could sync
>iterator return respective [[asyncIterator]] as well, just promisifying
>the result (as a sort of proto-proposal of sort)? Or is there some easy
>way to change sync iterable to async iterable, so I could change the
>other ones at call site? Thanks, Herby
>_______________________________________________ es-discuss mailing list
>es-discuss at mozilla.org https://mail.mozilla.org/listinfo/es-discuss


More information about the es-discuss mailing list