Skip to content

Commit

Permalink
fix some cases of async iteration closing
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Jul 12, 2022
1 parent b7a2f4f commit 7fffc95
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 44 deletions.
18 changes: 18 additions & 0 deletions packages/core-js/internals/async-iterator-close.js
@@ -0,0 +1,18 @@
var call = require('../internals/function-call');
var getBuiltIn = require('../internals/get-built-in');
var getMethod = require('../internals/get-method');

module.exports = function (iterator, method, argument, reject) {
try {
var returnMethod = getMethod(iterator, 'return');
if (returnMethod) {
return getBuiltIn('Promise').resolve(call(returnMethod, iterator)).then(function () {
method(argument);
}, function (error) {
reject(error);
});
}
} catch (error2) {
return reject(error2);
} method(argument);
};
41 changes: 14 additions & 27 deletions packages/core-js/internals/async-iterator-iteration.js
Expand Up @@ -7,7 +7,7 @@ var anObject = require('../internals/an-object');
var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');
var getBuiltIn = require('../internals/get-built-in');
var getIteratorDirect = require('../internals/get-iterator-direct');
var getMethod = require('../internals/get-method');
var closeAsyncIteration = require('../internals/async-iterator-close');

var createMethod = function (TYPE) {
var IS_TO_ARRAY = TYPE == 0;
Expand All @@ -24,58 +24,45 @@ var createMethod = function (TYPE) {
if (MAPPING || !IS_TO_ARRAY) aCallable(fn);

return new Promise(function (resolve, reject) {
var closeIteration = function (method, argument) {
try {
var returnMethod = getMethod(iterator, 'return');
if (returnMethod) {
return Promise.resolve(call(returnMethod, iterator)).then(function () {
method(argument);
}, function (error) {
reject(error);
});
}
} catch (error2) {
return reject(error2);
} method(argument);
};

var onError = function (error) {
closeIteration(reject, error);
var ifAbruptCloseAsyncIterator = function (error) {
closeAsyncIteration(iterator, reject, error, reject);
};

var loop = function () {
try {
if (IS_TO_ARRAY && MAPPING) doesNotExceedSafeInteger(index);
if (IS_TO_ARRAY && MAPPING) try {
doesNotExceedSafeInteger(index);
} catch (error4) { ifAbruptCloseAsyncIterator(error4); }
Promise.resolve(anObject(call(next, iterator))).then(function (step) {
try {
if (anObject(step).done) {
if (IS_TO_ARRAY) {
target.length = index;
resolve(target);
} else resolve(IS_SOME ? false : IS_EVERY || undefined);
} else {
} else try {
var value = step.value;
if (MAPPING) {
Promise.resolve(IS_TO_ARRAY ? fn(value, index) : fn(value)).then(function (result) {
if (IS_FOR_EACH) {
loop();
} else if (IS_EVERY) {
result ? loop() : closeIteration(resolve, false);
result ? loop() : closeAsyncIteration(iterator, resolve, false, reject);
} else if (IS_TO_ARRAY) {
target[index++] = result;
loop();
} else {
result ? closeIteration(resolve, IS_SOME || value) : loop();
result ? closeAsyncIteration(iterator, resolve, IS_SOME || value, reject) : loop();
}
}, onError);
}, ifAbruptCloseAsyncIterator);
} else {
target[index++] = value;
loop();
}
}
} catch (error) { onError(error); }
}, onError);
} catch (error2) { onError(error2); }
} catch (error3) { ifAbruptCloseAsyncIterator(error3); }
} catch (error2) { reject(error2); }
}, reject);
} catch (error) { reject(error); }
};

loop();
Expand Down
18 changes: 13 additions & 5 deletions packages/core-js/modules/esnext.async-iterator.filter.js
Expand Up @@ -6,26 +6,34 @@ var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var getIteratorDirect = require('../internals/get-iterator-direct');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
var closeAsyncIteration = require('../internals/async-iterator-close');

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

return new Promise(function (resolve, reject) {
var ifAbruptCloseAsyncIterator = function (error) {
closeAsyncIteration(iterator, reject, error, reject);
};

var loop = function () {
try {
Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) {
Promise.resolve(anObject(call(state.next, iterator))).then(function (step) {
try {
if (anObject(step).done) {
state.done = true;
resolve({ done: true, value: undefined });
} else {
var value = step.value;
Promise.resolve(filterer(value)).then(function (selected) {
selected ? resolve({ done: false, value: value }) : loop();
}, reject);
try {
Promise.resolve(filterer(value)).then(function (selected) {
selected ? resolve({ done: false, value: value }) : loop();
}, ifAbruptCloseAsyncIterator);
} catch (error3) { ifAbruptCloseAsyncIterator(error3); }
}
} catch (err) { reject(err); }
} catch (error2) { reject(error2); }
}, reject);
} catch (error) { reject(error); }
};
Expand Down
27 changes: 19 additions & 8 deletions packages/core-js/modules/esnext.async-iterator.map.js
Expand Up @@ -6,19 +6,30 @@ var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var getIteratorDirect = require('../internals/get-iterator-direct');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
var closeAsyncIteration = require('../internals/async-iterator-close');

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

return Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) {
if (anObject(step).done) {
state.done = true;
return { done: true, value: undefined };
}
return Promise.resolve(mapper(step.value)).then(function (value) {
return { done: false, value: value };
});
return new Promise(function (resolve, reject) {
var ifAbruptCloseAsyncIterator = function (error) {
closeAsyncIteration(iterator, reject, error, reject);
};

Promise.resolve(anObject(call(state.next, iterator))).then(function (step) {
try {
if (anObject(step).done) {
state.done = true;
resolve({ done: true, value: undefined });
} else try {
Promise.resolve(mapper(step.value)).then(function (value) {
resolve({ done: false, value: value });
}, ifAbruptCloseAsyncIterator);
} catch (error2) { ifAbruptCloseAsyncIterator(error2); }
} catch (error) { reject(error); }
}, reject);
});
});

Expand Down
13 changes: 9 additions & 4 deletions packages/core-js/modules/esnext.async-iterator.reduce.js
Expand Up @@ -6,6 +6,7 @@ var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var getBuiltIn = require('../internals/get-built-in');
var getIteratorDirect = require('../internals/get-iterator-direct');
var closeAsyncIteration = require('../internals/async-iterator-close');

var Promise = getBuiltIn('Promise');
var $TypeError = TypeError;
Expand All @@ -20,6 +21,10 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, {
aCallable(reducer);

return new Promise(function (resolve, reject) {
var ifAbruptCloseAsyncIterator = function (error) {
closeAsyncIteration(iterator, reject, error, reject);
};

var loop = function () {
try {
Promise.resolve(anObject(call(next, iterator))).then(function (step) {
Expand All @@ -32,14 +37,14 @@ $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, {
noInitial = false;
accumulator = value;
loop();
} else {
} else try {
Promise.resolve(reducer(accumulator, value)).then(function (result) {
accumulator = result;
loop();
}, reject);
}
}, ifAbruptCloseAsyncIterator);
} catch (error3) { ifAbruptCloseAsyncIterator(error3); }
}
} catch (err) { reject(err); }
} catch (error2) { reject(error2); }
}, reject);
} catch (error) { reject(error); }
};
Expand Down

0 comments on commit 7fffc95

Please sign in to comment.