Skip to content

Commit 8e58a6d

Browse files
committed
don't await non-objects returned from functions passed to AsyncIterator helpers
tc39/proposal-iterator-helpers#239
1 parent 98edc05 commit 8e58a6d

6 files changed

Lines changed: 45 additions & 14 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- `String.prototype.toWellFormed`
99
- Recent updates of the [iterator helpers proposal](https://github.com/tc39/proposal-iterator-helpers):
1010
- Added a counter parameter to helpers, [proposal-iterator-helpers/211](https://github.com/tc39/proposal-iterator-helpers/pull/211)
11+
- 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)
1112
- 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)
1213
- Added `inverse` option to `core-js-compat`, [#1119](https://github.com/zloirock/core-js/issues/1119)
1314
- Added `format` option to `core-js-builder`, [#1120](https://github.com/zloirock/core-js/issues/1120)

packages/core-js/internals/async-iterator-iteration.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
var call = require('../internals/function-call');
55
var aCallable = require('../internals/a-callable');
66
var anObject = require('../internals/an-object');
7+
var isObject = require('../internals/is-object');
78
var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');
89
var getBuiltIn = require('../internals/get-built-in');
910
var getIteratorDirect = require('../internals/get-iterator-direct');
@@ -44,20 +45,25 @@ var createMethod = function (TYPE) {
4445
var value = step.value;
4546
try {
4647
if (MAPPING) {
47-
Promise.resolve(fn(value, counter)).then(function (result) {
48+
var result = fn(value, counter);
49+
50+
var handler = function ($result) {
4851
if (IS_FOR_EACH) {
4952
loop();
5053
} else if (IS_EVERY) {
51-
result ? loop() : closeAsyncIteration(iterator, resolve, false, reject);
54+
$result ? loop() : closeAsyncIteration(iterator, resolve, false, reject);
5255
} else if (IS_TO_ARRAY) {
5356
try {
54-
target[counter++] = result;
57+
target[counter++] = $result;
5558
loop();
5659
} catch (error4) { ifAbruptCloseAsyncIterator(error4); }
5760
} else {
58-
result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop();
61+
$result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop();
5962
}
60-
}, ifAbruptCloseAsyncIterator);
63+
};
64+
65+
if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator);
66+
else handler(result);
6167
} else {
6268
target[counter++] = value;
6369
loop();

packages/core-js/modules/esnext.async-iterator.filter.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var $ = require('../internals/export');
44
var call = require('../internals/function-call');
55
var aCallable = require('../internals/a-callable');
66
var anObject = require('../internals/an-object');
7+
var isObject = require('../internals/is-object');
78
var getIteratorDirect = require('../internals/get-iterator-direct');
89
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
910
var createIterResultObject = require('../internals/create-iter-result-object');
@@ -34,9 +35,14 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
3435
} else {
3536
var value = step.value;
3637
try {
37-
Promise.resolve(filterer(value, state.counter++)).then(function (selected) {
38+
var result = filterer(value, state.counter++);
39+
40+
var handler = function (selected) {
3841
selected ? resolve(createIterResultObject(value, false)) : loop();
39-
}, ifAbruptCloseAsyncIterator);
42+
};
43+
44+
if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator);
45+
else handler(result);
4046
} catch (error3) { ifAbruptCloseAsyncIterator(error3); }
4147
}
4248
} catch (error2) { doneAndReject(error2); }

packages/core-js/modules/esnext.async-iterator.flat-map.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var $ = require('../internals/export');
44
var call = require('../internals/function-call');
55
var aCallable = require('../internals/a-callable');
66
var anObject = require('../internals/an-object');
7+
var isObject = require('../internals/is-object');
78
var getIteratorDirect = require('../internals/get-iterator-direct');
89
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
910
var createIterResultObject = require('../internals/create-iter-result-object');
@@ -36,13 +37,18 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
3637
} else {
3738
var value = step.value;
3839
try {
39-
Promise.resolve(mapper(value, state.counter++)).then(function (mapped) {
40+
var result = mapper(value, state.counter++);
41+
42+
var handler = function (mapped) {
4043
try {
4144
state.innerIterator = innerIterator = getAsyncIterator(mapped);
4245
state.innerNext = aCallable(innerIterator.next);
4346
innerLoop();
4447
} catch (error4) { ifAbruptCloseAsyncIterator(error4); }
45-
}, ifAbruptCloseAsyncIterator);
48+
};
49+
50+
if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator);
51+
else handler(result);
4652
} catch (error3) { ifAbruptCloseAsyncIterator(error3); }
4753
}
4854
} catch (error2) { doneAndReject(error2); }

packages/core-js/modules/esnext.async-iterator.map.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var $ = require('../internals/export');
44
var call = require('../internals/function-call');
55
var aCallable = require('../internals/a-callable');
66
var anObject = require('../internals/an-object');
7+
var isObject = require('../internals/is-object');
78
var getIteratorDirect = require('../internals/get-iterator-direct');
89
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
910
var createIterResultObject = require('../internals/create-iter-result-object');
@@ -32,9 +33,14 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
3233
} else {
3334
var value = step.value;
3435
try {
35-
Promise.resolve(mapper(value, state.counter++)).then(function (mapped) {
36+
var result = mapper(value, state.counter++);
37+
38+
var handler = function (mapped) {
3639
resolve(createIterResultObject(mapped, false));
37-
}, ifAbruptCloseAsyncIterator);
40+
};
41+
42+
if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator);
43+
else handler(result);
3844
} catch (error2) { ifAbruptCloseAsyncIterator(error2); }
3945
}
4046
} catch (error) { doneAndReject(error); }

packages/core-js/modules/esnext.async-iterator.reduce.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var $ = require('../internals/export');
44
var call = require('../internals/function-call');
55
var aCallable = require('../internals/a-callable');
66
var anObject = require('../internals/an-object');
7+
var isObject = require('../internals/is-object');
78
var getBuiltIn = require('../internals/get-built-in');
89
var getIteratorDirect = require('../internals/get-iterator-direct');
910
var closeAsyncIteration = require('../internals/async-iterator-close');
@@ -39,10 +40,15 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, {
3940
accumulator = value;
4041
loop();
4142
} else try {
42-
Promise.resolve(reducer(accumulator, value, counter)).then(function (result) {
43-
accumulator = result;
43+
var result = reducer(accumulator, value, counter);
44+
45+
var handler = function ($result) {
46+
accumulator = $result;
4447
loop();
45-
}, ifAbruptCloseAsyncIterator);
48+
};
49+
50+
if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator);
51+
else handler(result);
4652
} catch (error3) { ifAbruptCloseAsyncIterator(error3); }
4753
}
4854
counter++;

0 commit comments

Comments
 (0)