Skip to content

Commit

Permalink
fix CreateAsyncFromSyncIterator semantic in AsyncIterator.from, r…
Browse files Browse the repository at this point in the history
…elated to #765
  • Loading branch information
zloirock committed Aug 24, 2021
1 parent 4e72728 commit 0333511
Show file tree
Hide file tree
Showing 11 changed files with 20 additions and 13 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
@@ -1,5 +1,6 @@
## Changelog
##### Unreleased
- Fixed `CreateAsyncFromSyncIterator` semantic in `AsyncIterator.from`, related to [#765](https://github.com/zloirock/core-js/issues/765)
- Added a workaround of a specific case of broken `Object.prototype`, [#973](https://github.com/zloirock/core-js/issues/973)

##### 3.16.2 - 2021.08.17
Expand Down
3 changes: 2 additions & 1 deletion packages/core-js/internals/async-iterator-create-proxy.js
Expand Up @@ -42,9 +42,10 @@ module.exports = function (nextHandler, IS_ITERATOR) {
AsyncIteratorProxy.prototype = redefineAll(create(path.AsyncIterator.prototype), {
next: function next(arg) {
var state = getInternalState(this);
var hasArg = !!arguments.length;
if (state.done) return Promise.resolve({ done: true, value: undefined });
try {
return Promise.resolve(anObject(nextHandler.call(state, arg, Promise)));
return Promise.resolve(anObject(nextHandler.call(state, Promise, hasArg ? arg : undefined, hasArg)));
} catch (error) {
return Promise.reject(error);
}
Expand Down
Expand Up @@ -4,7 +4,7 @@ var $ = require('../internals/export');
var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var state = this;
var iterator = state.iterator;

Expand Down
2 changes: 1 addition & 1 deletion packages/core-js/modules/esnext.async-iterator.drop.js
Expand Up @@ -5,7 +5,7 @@ var anObject = require('../internals/an-object');
var toPositiveInteger = require('../internals/to-positive-integer');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var state = this;

return new Promise(function (resolve, reject) {
Expand Down
2 changes: 1 addition & 1 deletion packages/core-js/modules/esnext.async-iterator.filter.js
Expand Up @@ -5,7 +5,7 @@ var aFunction = require('../internals/a-function');
var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var state = this;
var filterer = state.filterer;

Expand Down
2 changes: 1 addition & 1 deletion packages/core-js/modules/esnext.async-iterator.flat-map.js
Expand Up @@ -6,7 +6,7 @@ var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
var getAsyncIteratorMethod = require('../internals/get-async-iterator-method');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var state = this;
var mapper = state.mapper;
var innerIterator, iteratorMethod;
Expand Down
8 changes: 6 additions & 2 deletions packages/core-js/modules/esnext.async-iterator.from.js
Expand Up @@ -9,8 +9,12 @@ var getAsyncIteratorMethod = require('../internals/get-async-iterator-method');

var AsyncIterator = path.AsyncIterator;

var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg) {
return anObject(this.next.call(this.iterator, arg));
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg, hasArg) {
var step = anObject(this.next.apply(this.iterator, hasArg ? [arg] : []));
var done = step.done;
return Promise.resolve(step.value).then(function (value) {
return { done: done, value: value };
});
}, true);

$({ target: 'AsyncIterator', stat: true }, {
Expand Down
2 changes: 1 addition & 1 deletion packages/core-js/modules/esnext.async-iterator.map.js
Expand Up @@ -5,7 +5,7 @@ var aFunction = require('../internals/a-function');
var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var state = this;
var mapper = state.mapper;

Expand Down
2 changes: 1 addition & 1 deletion packages/core-js/modules/esnext.async-iterator.take.js
Expand Up @@ -5,7 +5,7 @@ var anObject = require('../internals/an-object');
var toPositiveInteger = require('../internals/to-positive-integer');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var iterator = this.iterator;
var returnMethod, result;
if (!this.remaining--) {
Expand Down
5 changes: 3 additions & 2 deletions tests/pure/esnext.async-iterator.from.js
@@ -1,4 +1,5 @@
import AsyncIterator from 'core-js-pure/features/async-iterator';
import Promise from 'core-js-pure/features/promise';
import assign from 'core-js-pure/features/object/assign';
import values from 'core-js-pure/features/array/values';

Expand All @@ -14,8 +15,8 @@ QUnit.test('AsyncIterator.from', assert => {

assert.ok(AsyncIterator.from([]) instanceof AsyncIterator, 'proxy, iterable');

AsyncIterator.from([1, 2, 3]).toArray().then(result => {
assert.arrayEqual(result, [1, 2, 3], 'just a proxy');
AsyncIterator.from([1, Promise.resolve(2), 3]).toArray().then(result => {
assert.arrayEqual(result, [1, 2, 3], 'unwrap promises');
async();
});

Expand Down
4 changes: 2 additions & 2 deletions tests/tests/esnext.async-iterator.from.js
Expand Up @@ -13,8 +13,8 @@ QUnit.test('AsyncIterator.from', assert => {

assert.ok(AsyncIterator.from([]) instanceof AsyncIterator, 'proxy, iterable');

AsyncIterator.from([1, 2, 3]).toArray().then(result => {
assert.arrayEqual(result, [1, 2, 3], 'just a proxy');
AsyncIterator.from([1, Promise.resolve(2), 3]).toArray().then(result => {
assert.arrayEqual(result, [1, 2, 3], 'unwrap promises');
async();
});

Expand Down

0 comments on commit 0333511

Please sign in to comment.