Skip to content

Commit

Permalink
behavior of .next, .return, .throw methods on AsyncIterator h…
Browse files Browse the repository at this point in the history
…elpers proxy iterators aligned with the current spec draft (built-in async generators) (mainly - some early errors moved to returned promises)
  • Loading branch information
zloirock committed Aug 29, 2021
1 parent 8df6d0e commit 322be73
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 40 deletions.
3 changes: 2 additions & 1 deletion 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)
Expand Down
45 changes: 21 additions & 24 deletions packages/core-js/internals/async-iterator-create-proxy.js
Expand Up @@ -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);
Expand All @@ -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) {
Expand Down
26 changes: 11 additions & 15 deletions packages/core-js/internals/iterator-create-proxy.js
Expand Up @@ -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);
Expand All @@ -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) {
Expand Down

0 comments on commit 322be73

Please sign in to comment.