| | |
| | | 'use strict'; |
| | | 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 redefineAll = require('../internals/redefine-all'); |
| | | var defineBuiltIns = require('../internals/define-built-ins'); |
| | | var wellKnownSymbol = require('../internals/well-known-symbol'); |
| | | var InternalStateModule = require('../internals/internal-state'); |
| | | var getBuiltIn = require('../internals/get-built-in'); |
| | |
| | | |
| | | var Promise = getBuiltIn('Promise'); |
| | | |
| | | var ASYNC_ITERATOR_PROXY = 'AsyncIteratorProxy'; |
| | | var setInternalState = InternalStateModule.set; |
| | | var getInternalState = InternalStateModule.get; |
| | | var getInternalState = InternalStateModule.getterFor(ASYNC_ITERATOR_PROXY); |
| | | |
| | | var TO_STRING_TAG = wellKnownSymbol('toStringTag'); |
| | | |
| | | module.exports = function (nextHandler, IS_ITERATOR) { |
| | | var AsyncIteratorProxy = function AsyncIterator(state) { |
| | | state.type = ASYNC_ITERATOR_PROXY; |
| | | state.next = aCallable(state.iterator.next); |
| | | state.done = false; |
| | | state.ignoreArgument = !IS_ITERATOR; |
| | | setInternalState(this, state); |
| | | }; |
| | | |
| | | AsyncIteratorProxy.prototype = redefineAll(create(AsyncIteratorPrototype), { |
| | | AsyncIteratorProxy.prototype = defineBuiltIns(create(AsyncIteratorPrototype), { |
| | | next: function next(arg) { |
| | | var that = this; |
| | | var hasArgument = !!arguments.length; |
| | |
| | | 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(nextHandler.call(state, Promise, args))); |
| | | resolve(state.done ? { done: true, value: undefined } : anObject(call(nextHandler, state, Promise, args))); |
| | | }); |
| | | }, |
| | | 'return': function (value) { |
| | |
| | | state.done = true; |
| | | var $$return = getMethod(iterator, 'return'); |
| | | if ($$return === undefined) return resolve({ done: true, value: value }); |
| | | Promise.resolve($$return.call(iterator, value)).then(function (result) { |
| | | Promise.resolve(call($$return, iterator, value)).then(function (result) { |
| | | anObject(result); |
| | | resolve({ done: true, value: value }); |
| | | }, reject); |
| | |
| | | state.done = true; |
| | | var $$throw = getMethod(iterator, 'throw'); |
| | | if ($$throw === undefined) return reject(value); |
| | | resolve($$throw.call(iterator, value)); |
| | | resolve(call($$throw, iterator, value)); |
| | | }); |
| | | } |
| | | }); |