Skip to content

Commit 322be73

Browse files
committed
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)
1 parent 8df6d0e commit 322be73

File tree

3 files changed

+34
-40
lines changed

3 files changed

+34
-40
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
## Changelog
22
##### Unreleased
33
- `AsyncFromSyncIterator` made stricter, related mainly to `AsyncIterator.from` and `AsyncIterator.prototype.flatMap`
4-
- 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)
4+
- 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)
5+
- 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)
56

67
##### 3.16.3 - 2021.08.25
78
- Fixed `CreateAsyncFromSyncIterator` semantic in `AsyncIterator.from`, related to [#765](https://github.com/zloirock/core-js/issues/765)

packages/core-js/internals/async-iterator-create-proxy.js

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,6 @@ var getInternalState = InternalStateModule.get;
1616

1717
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
1818

19-
var $return = function (value) {
20-
var iterator = getInternalState(this).iterator;
21-
var $$return = iterator['return'];
22-
return $$return === undefined
23-
? Promise.resolve({ done: true, value: value })
24-
: anObject($$return.call(iterator, value));
25-
};
26-
27-
var $throw = function (value) {
28-
var iterator = getInternalState(this).iterator;
29-
var $$throw = iterator['throw'];
30-
return $$throw === undefined
31-
? Promise.reject(value)
32-
: $$throw.call(iterator, value);
33-
};
34-
3519
module.exports = function (nextHandler, IS_ITERATOR) {
3620
var AsyncIteratorProxy = function AsyncIterator(state) {
3721
state.next = aFunction(state.iterator.next);
@@ -45,15 +29,28 @@ module.exports = function (nextHandler, IS_ITERATOR) {
4529
var state = getInternalState(this);
4630
var args = arguments.length ? [state.ignoreArg ? undefined : arg] : IS_ITERATOR ? [] : [undefined];
4731
state.ignoreArg = false;
48-
if (state.done) return Promise.resolve({ done: true, value: undefined });
49-
try {
50-
return Promise.resolve(anObject(nextHandler.call(state, Promise, args)));
51-
} catch (error) {
52-
return Promise.reject(error);
53-
}
32+
return new Promise(function (resolve) {
33+
resolve(state.done ? { done: true, value: undefined } : anObject(nextHandler.call(state, Promise, args)));
34+
});
35+
},
36+
'return': function (value) {
37+
var iterator = getInternalState(this).iterator;
38+
return new Promise(function (resolve, reject) {
39+
var $$return = iterator['return'];
40+
if ($$return === undefined) return resolve({ done: true, value: value });
41+
Promise.resolve(anObject($$return.call(iterator, value)).value).then(function (result) {
42+
resolve({ done: true, value: result });
43+
}, reject);
44+
});
5445
},
55-
'return': $return,
56-
'throw': $throw
46+
'throw': function (value) {
47+
var iterator = getInternalState(this).iterator;
48+
return new Promise(function (resolve, reject) {
49+
var $$throw = iterator['throw'];
50+
if ($$throw === undefined) return reject(value);
51+
resolve($$throw.call(iterator, value));
52+
});
53+
}
5754
});
5855

5956
if (!IS_ITERATOR) {

packages/core-js/internals/iterator-create-proxy.js

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,6 @@ var getInternalState = InternalStateModule.get;
1313

1414
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
1515

16-
var $return = function (value) {
17-
var iterator = getInternalState(this).iterator;
18-
var $$return = iterator['return'];
19-
return $$return === undefined ? { done: true, value: value } : anObject($$return.call(iterator, value));
20-
};
21-
22-
var $throw = function (value) {
23-
var iterator = getInternalState(this).iterator;
24-
var $$throw = iterator['throw'];
25-
if ($$throw === undefined) throw value;
26-
return $$throw.call(iterator, value);
27-
};
28-
2916
module.exports = function (nextHandler, IS_ITERATOR) {
3017
var IteratorProxy = function Iterator(state) {
3118
state.next = aFunction(state.iterator.next);
@@ -42,8 +29,17 @@ module.exports = function (nextHandler, IS_ITERATOR) {
4229
var result = state.done ? undefined : nextHandler.call(state, args);
4330
return { done: state.done, value: result };
4431
},
45-
'return': $return,
46-
'throw': $throw
32+
'return': function (value) {
33+
var iterator = getInternalState(this).iterator;
34+
var $$return = iterator['return'];
35+
return { done: true, value: $$return === undefined ? value : anObject($$return.call(iterator, value)).value };
36+
},
37+
'throw': function (value) {
38+
var iterator = getInternalState(this).iterator;
39+
var $$throw = iterator['throw'];
40+
if ($$throw === undefined) throw value;
41+
return $$throw.call(iterator, value);
42+
}
4743
});
4844

4945
if (!IS_ITERATOR) {

0 commit comments

Comments
 (0)