Should it await next.value when not passing a mapper function? (original) (raw)
Consider this async iterable:
const it = { Symbol.asyncIterator { return { async next() { if (i > 2) return { done: true }; i++; return { value: Promise.resolve(i), done: false } } } } }
Unless I'm reading the spec wrong, await Array.fromAsync(it) returns [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)] while await Array.fromAsync(it, x => x) returns [1, 2, 3].
Currently, when using Array.from, x => x is the "default mapper function" (even if it's not specified as such): Array.from(something) is always equivalent to Array.from(something, x => x). However, there is no "default function" that can be passed to Array.fromAsync.
If we changed Array.fromAsync(something) to await the next.value values, await Array.fromAsync(it) would always return the same result as await Array.fromAsync(it, x => x). In practice, it means making it behave like
const arr = []; for await (const nextValue of it) arr.push(await nextValue);