async-from-sync-iterator.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. 'use strict';
  2. var path = require('../internals/path');
  3. var anObject = require('../internals/an-object');
  4. var create = require('../internals/object-create');
  5. var getMethod = require('../internals/get-method');
  6. var redefineAll = require('../internals/redefine-all');
  7. var InternalStateModule = require('../internals/internal-state');
  8. var getBuiltIn = require('../internals/get-built-in');
  9. var Promise = getBuiltIn('Promise');
  10. var setInternalState = InternalStateModule.set;
  11. var getInternalState = InternalStateModule.get;
  12. var asyncFromSyncIteratorContinuation = function (result, resolve, reject) {
  13. var done = result.done;
  14. Promise.resolve(result.value).then(function (value) {
  15. resolve({ done: done, value: value });
  16. }, reject);
  17. };
  18. var AsyncFromSyncIterator = function AsyncIterator(iterator) {
  19. setInternalState(this, {
  20. iterator: anObject(iterator),
  21. next: iterator.next
  22. });
  23. };
  24. AsyncFromSyncIterator.prototype = redefineAll(create(path.AsyncIterator.prototype), {
  25. next: function next(arg) {
  26. var state = getInternalState(this);
  27. var hasArg = !!arguments.length;
  28. return new Promise(function (resolve, reject) {
  29. var result = anObject(state.next.apply(state.iterator, hasArg ? [arg] : []));
  30. asyncFromSyncIteratorContinuation(result, resolve, reject);
  31. });
  32. },
  33. 'return': function (arg) {
  34. var iterator = getInternalState(this).iterator;
  35. var hasArg = !!arguments.length;
  36. return new Promise(function (resolve, reject) {
  37. var $return = getMethod(iterator['return']);
  38. if ($return === undefined) return resolve({ done: true, value: arg });
  39. var result = anObject($return.apply(iterator, hasArg ? [arg] : []));
  40. asyncFromSyncIteratorContinuation(result, resolve, reject);
  41. });
  42. },
  43. 'throw': function (arg) {
  44. var iterator = getInternalState(this).iterator;
  45. var hasArg = !!arguments.length;
  46. return new Promise(function (resolve, reject) {
  47. var $throw = getMethod(iterator['throw']);
  48. if ($throw === undefined) return reject(arg);
  49. var result = anObject($throw.apply(iterator, hasArg ? [arg] : []));
  50. asyncFromSyncIteratorContinuation(result, resolve, reject);
  51. });
  52. }
  53. });
  54. module.exports = AsyncFromSyncIterator;