'use strict';
-var path = require('../internals/path');
-var aFunction = require('../internals/a-function');
+var call = require('../internals/function-call');
+var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var create = require('../internals/object-create');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var wellKnownSymbol = require('../internals/well-known-symbol');
var InternalStateModule = require('../internals/internal-state');
var getBuiltIn = require('../internals/get-built-in');
+var getMethod = require('../internals/get-method');
+var AsyncIteratorPrototype = require('../internals/async-iterator-prototype');
var Promise = getBuiltIn('Promise');
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);
+ state.next = aCallable(state.iterator.next);
state.done = false;
+ state.ignoreArgument = !IS_ITERATOR;
setInternalState(this, state);
};
- AsyncIteratorProxy.prototype = redefineAll(create(path.AsyncIterator.prototype), {
+ AsyncIteratorProxy.prototype = redefineAll(create(AsyncIteratorPrototype), {
next: function next(arg) {
- var state = getInternalState(this);
- if (state.done) return Promise.resolve({ done: true, value: undefined });
- try {
- return Promise.resolve(anObject(nextHandler.call(state, arg, Promise)));
- } catch (error) {
- return Promise.reject(error);
- }
+ var that = this;
+ var hasArgument = !!arguments.length;
+ return new Promise(function (resolve) {
+ var state = getInternalState(that);
+ var args = hasArgument ? [state.ignoreArgument ? undefined : arg] : IS_ITERATOR ? [] : [undefined];
+ state.ignoreArgument = false;
+ resolve(state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise, args)));
+ });
+ },
+ 'return': function (value) {
+ var that = this;
+ return new Promise(function (resolve, reject) {
+ var state = getInternalState(that);
+ var iterator = state.iterator;
+ state.done = true;
+ var $$return = getMethod(iterator, 'return');
+ if ($$return === undefined) return resolve({ done: true, value: value });
+ Promise.resolve(call($$return, iterator, value)).then(function (result) {
+ anObject(result);
+ resolve({ done: true, value: value });
+ }, reject);
+ });
},
- 'return': $return,
- 'throw': $throw
+ 'throw': function (value) {
+ var that = this;
+ return new Promise(function (resolve, reject) {
+ var state = getInternalState(that);
+ var iterator = state.iterator;
+ state.done = true;
+ var $$throw = getMethod(iterator, 'throw');
+ if ($$throw === undefined) return reject(value);
+ resolve(call($$throw, iterator, value));
+ });
+ }
});
if (!IS_ITERATOR) {