diff --git a/CHANGELOG.md b/CHANGELOG.md index b23711e9fd95..d2b4958aaffd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## Changelog ##### Unreleased - `AsyncFromSyncIterator` made stricter, related mainly to `AsyncIterator.from` and `AsyncIterator.prototype.flatMap` -- Handling of optional `.next` arguments in `(Async)Iterator` methods is aligned with the current spec draft (mainly - ignoring of the first passed to `.next` arguments in built-in generators) +- Handling of optional `.next` arguments in `(Async)Iterator` methods is aligned with the current spec draft (mainly - ignoring the first passed to `.next` argument in built-in generators) +- Behavior of `.next`, `.return`, `.throw` methods on `AsyncIterator` helpers proxy iterators aligned with the current spec draft (built-in async generators) (mainly - some early errors moved to returned promises) ##### 3.16.3 - 2021.08.25 - Fixed `CreateAsyncFromSyncIterator` semantic in `AsyncIterator.from`, related to [#765](https://github.com/zloirock/core-js/issues/765) diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 5325300d73b1..1769accd08d2 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -16,22 +16,6 @@ var getInternalState = InternalStateModule.get; var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var $return = function (value) { - var iterator = getInternalState(this).iterator; - var $$return = iterator['return']; - return $$return === undefined - ? Promise.resolve({ done: true, value: value }) - : anObject($$return.call(iterator, value)); -}; - -var $throw = function (value) { - var iterator = getInternalState(this).iterator; - var $$throw = iterator['throw']; - return $$throw === undefined - ? Promise.reject(value) - : $$throw.call(iterator, value); -}; - module.exports = function (nextHandler, IS_ITERATOR) { var AsyncIteratorProxy = function AsyncIterator(state) { state.next = aFunction(state.iterator.next); @@ -45,15 +29,28 @@ module.exports = function (nextHandler, IS_ITERATOR) { var state = getInternalState(this); var args = arguments.length ? [state.ignoreArg ? undefined : arg] : IS_ITERATOR ? [] : [undefined]; state.ignoreArg = false; - if (state.done) return Promise.resolve({ done: true, value: undefined }); - try { - return Promise.resolve(anObject(nextHandler.call(state, Promise, args))); - } catch (error) { - return Promise.reject(error); - } + return new Promise(function (resolve) { + resolve(state.done ? { done: true, value: undefined } : anObject(nextHandler.call(state, Promise, args))); + }); + }, + 'return': function (value) { + var iterator = getInternalState(this).iterator; + return new Promise(function (resolve, reject) { + var $$return = iterator['return']; + if ($$return === undefined) return resolve({ done: true, value: value }); + Promise.resolve(anObject($$return.call(iterator, value)).value).then(function (result) { + resolve({ done: true, value: result }); + }, reject); + }); }, - 'return': $return, - 'throw': $throw + 'throw': function (value) { + var iterator = getInternalState(this).iterator; + return new Promise(function (resolve, reject) { + var $$throw = iterator['throw']; + if ($$throw === undefined) return reject(value); + resolve($$throw.call(iterator, value)); + }); + } }); if (!IS_ITERATOR) { diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index fc756afaaee5..8af67004c960 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -13,19 +13,6 @@ var getInternalState = InternalStateModule.get; var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var $return = function (value) { - var iterator = getInternalState(this).iterator; - var $$return = iterator['return']; - return $$return === undefined ? { done: true, value: value } : anObject($$return.call(iterator, value)); -}; - -var $throw = function (value) { - var iterator = getInternalState(this).iterator; - var $$throw = iterator['throw']; - if ($$throw === undefined) throw value; - return $$throw.call(iterator, value); -}; - module.exports = function (nextHandler, IS_ITERATOR) { var IteratorProxy = function Iterator(state) { state.next = aFunction(state.iterator.next); @@ -42,8 +29,17 @@ module.exports = function (nextHandler, IS_ITERATOR) { var result = state.done ? undefined : nextHandler.call(state, args); return { done: state.done, value: result }; }, - 'return': $return, - 'throw': $throw + 'return': function (value) { + var iterator = getInternalState(this).iterator; + var $$return = iterator['return']; + return { done: true, value: $$return === undefined ? value : anObject($$return.call(iterator, value)).value }; + }, + 'throw': function (value) { + var iterator = getInternalState(this).iterator; + var $$throw = iterator['throw']; + if ($$throw === undefined) throw value; + return $$throw.call(iterator, value); + } }); if (!IS_ITERATOR) {