From 8e58a6da905c315269614bd969fd6be2e121eeb6 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 20 Oct 2022 21:00:38 +0700 Subject: [PATCH] don't await non-objects returned from functions passed to `AsyncIterator` helpers https://github.com/tc39/proposal-iterator-helpers/pull/239 --- CHANGELOG.md | 1 + .../internals/async-iterator-iteration.js | 16 +++++++++++----- .../modules/esnext.async-iterator.filter.js | 10 ++++++++-- .../modules/esnext.async-iterator.flat-map.js | 10 ++++++++-- .../core-js/modules/esnext.async-iterator.map.js | 10 ++++++++-- .../modules/esnext.async-iterator.reduce.js | 12 +++++++++--- 6 files changed, 45 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aeee4f6e5362..7e45d1d0512a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - `String.prototype.toWellFormed` - Recent updates of the [iterator helpers proposal](https://github.com/tc39/proposal-iterator-helpers): - Added a counter parameter to helpers, [proposal-iterator-helpers/211](https://github.com/tc39/proposal-iterator-helpers/pull/211) + - Don't await non-objects returned from functions passed to `AsyncIterator` helpers, [proposal-iterator-helpers/239](https://github.com/tc39/proposal-iterator-helpers/pull/239) - Early exit on broken `.next` in missed cases of `{ Iterator, AsyncIterator }.from`, [proposal-iterator-helpers/232](https://github.com/tc39/proposal-iterator-helpers/pull/232) - Added `inverse` option to `core-js-compat`, [#1119](https://github.com/zloirock/core-js/issues/1119) - Added `format` option to `core-js-builder`, [#1120](https://github.com/zloirock/core-js/issues/1120) diff --git a/packages/core-js/internals/async-iterator-iteration.js b/packages/core-js/internals/async-iterator-iteration.js index ef4c21916289..381bf236854d 100644 --- a/packages/core-js/internals/async-iterator-iteration.js +++ b/packages/core-js/internals/async-iterator-iteration.js @@ -4,6 +4,7 @@ var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); +var isObject = require('../internals/is-object'); var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer'); var getBuiltIn = require('../internals/get-built-in'); var getIteratorDirect = require('../internals/get-iterator-direct'); @@ -44,20 +45,25 @@ var createMethod = function (TYPE) { var value = step.value; try { if (MAPPING) { - Promise.resolve(fn(value, counter)).then(function (result) { + var result = fn(value, counter); + + var handler = function ($result) { if (IS_FOR_EACH) { loop(); } else if (IS_EVERY) { - result ? loop() : closeAsyncIteration(iterator, resolve, false, reject); + $result ? loop() : closeAsyncIteration(iterator, resolve, false, reject); } else if (IS_TO_ARRAY) { try { - target[counter++] = result; + target[counter++] = $result; loop(); } catch (error4) { ifAbruptCloseAsyncIterator(error4); } } else { - result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop(); + $result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop(); } - }, ifAbruptCloseAsyncIterator); + }; + + if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); + else handler(result); } else { target[counter++] = value; loop(); diff --git a/packages/core-js/modules/esnext.async-iterator.filter.js b/packages/core-js/modules/esnext.async-iterator.filter.js index 49c9700ee7fb..693210f70127 100644 --- a/packages/core-js/modules/esnext.async-iterator.filter.js +++ b/packages/core-js/modules/esnext.async-iterator.filter.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); +var isObject = require('../internals/is-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); var createIterResultObject = require('../internals/create-iter-result-object'); @@ -34,9 +35,14 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { } else { var value = step.value; try { - Promise.resolve(filterer(value, state.counter++)).then(function (selected) { + var result = filterer(value, state.counter++); + + var handler = function (selected) { selected ? resolve(createIterResultObject(value, false)) : loop(); - }, ifAbruptCloseAsyncIterator); + }; + + if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); + else handler(result); } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } } catch (error2) { doneAndReject(error2); } diff --git a/packages/core-js/modules/esnext.async-iterator.flat-map.js b/packages/core-js/modules/esnext.async-iterator.flat-map.js index 7e12ba7b4069..2ab72400b7fb 100644 --- a/packages/core-js/modules/esnext.async-iterator.flat-map.js +++ b/packages/core-js/modules/esnext.async-iterator.flat-map.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); +var isObject = require('../internals/is-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); var createIterResultObject = require('../internals/create-iter-result-object'); @@ -36,13 +37,18 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { } else { var value = step.value; try { - Promise.resolve(mapper(value, state.counter++)).then(function (mapped) { + var result = mapper(value, state.counter++); + + var handler = function (mapped) { try { state.innerIterator = innerIterator = getAsyncIterator(mapped); state.innerNext = aCallable(innerIterator.next); innerLoop(); } catch (error4) { ifAbruptCloseAsyncIterator(error4); } - }, ifAbruptCloseAsyncIterator); + }; + + if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); + else handler(result); } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } } catch (error2) { doneAndReject(error2); } diff --git a/packages/core-js/modules/esnext.async-iterator.map.js b/packages/core-js/modules/esnext.async-iterator.map.js index f6b6cae94362..b8b2226e9765 100644 --- a/packages/core-js/modules/esnext.async-iterator.map.js +++ b/packages/core-js/modules/esnext.async-iterator.map.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); +var isObject = require('../internals/is-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); var createIterResultObject = require('../internals/create-iter-result-object'); @@ -32,9 +33,14 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { } else { var value = step.value; try { - Promise.resolve(mapper(value, state.counter++)).then(function (mapped) { + var result = mapper(value, state.counter++); + + var handler = function (mapped) { resolve(createIterResultObject(mapped, false)); - }, ifAbruptCloseAsyncIterator); + }; + + if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); + else handler(result); } catch (error2) { ifAbruptCloseAsyncIterator(error2); } } } catch (error) { doneAndReject(error); } diff --git a/packages/core-js/modules/esnext.async-iterator.reduce.js b/packages/core-js/modules/esnext.async-iterator.reduce.js index 02f819ebd86c..01f3e444d2d9 100644 --- a/packages/core-js/modules/esnext.async-iterator.reduce.js +++ b/packages/core-js/modules/esnext.async-iterator.reduce.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); +var isObject = require('../internals/is-object'); var getBuiltIn = require('../internals/get-built-in'); var getIteratorDirect = require('../internals/get-iterator-direct'); var closeAsyncIteration = require('../internals/async-iterator-close'); @@ -39,10 +40,15 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { accumulator = value; loop(); } else try { - Promise.resolve(reducer(accumulator, value, counter)).then(function (result) { - accumulator = result; + var result = reducer(accumulator, value, counter); + + var handler = function ($result) { + accumulator = $result; loop(); - }, ifAbruptCloseAsyncIterator); + }; + + if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); + else handler(result); } catch (error3) { ifAbruptCloseAsyncIterator(error3); } } counter++;