array-from-async.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. 'use strict';
  2. var bind = require('../internals/function-bind-context');
  3. var uncurryThis = require('../internals/function-uncurry-this');
  4. var isConstructor = require('../internals/is-constructor');
  5. var getAsyncIterator = require('../internals/get-async-iterator');
  6. var getIterator = require('../internals/get-iterator');
  7. var getIteratorDirect = require('../internals/get-iterator-direct');
  8. var getIteratorMethod = require('../internals/get-iterator-method');
  9. var getMethod = require('../internals/get-method');
  10. var getBuiltIn = require('../internals/get-built-in');
  11. var getBuiltInPrototypeMethod = require('../internals/get-built-in-prototype-method');
  12. var wellKnownSymbol = require('../internals/well-known-symbol');
  13. var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator');
  14. var toArray = require('../internals/async-iterator-iteration').toArray;
  15. var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator');
  16. var arrayIterator = uncurryThis(getBuiltInPrototypeMethod('Array', 'values'));
  17. var arrayIteratorNext = uncurryThis(arrayIterator([]).next);
  18. var safeArrayIterator = function () {
  19. return new SafeArrayIterator(this);
  20. };
  21. var SafeArrayIterator = function (O) {
  22. this.iterator = arrayIterator(O);
  23. };
  24. SafeArrayIterator.prototype.next = function () {
  25. return arrayIteratorNext(this.iterator);
  26. };
  27. // `Array.fromAsync` method implementation
  28. // https://github.com/tc39/proposal-array-from-async
  29. module.exports = function fromAsync(items /* , mapfn = undefined, thisArg = undefined */) {
  30. var C = this;
  31. var argumentsLength = arguments.length;
  32. var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
  33. var thisArg = argumentsLength > 2 ? arguments[2] : undefined;
  34. return new (getBuiltIn('Promise'))(function (resolve) {
  35. if (mapfn !== undefined) mapfn = bind(mapfn, thisArg);
  36. var usingAsyncIterator = getMethod(items, ASYNC_ITERATOR);
  37. var usingSyncIterator = usingAsyncIterator ? undefined : getIteratorMethod(items) || safeArrayIterator;
  38. var A = isConstructor(C) ? new C() : [];
  39. var iterator = usingAsyncIterator
  40. ? getAsyncIterator(items, usingAsyncIterator)
  41. : new AsyncFromSyncIterator(getIteratorDirect(getIterator(items, usingSyncIterator)));
  42. resolve(toArray(iterator, mapfn, A));
  43. });
  44. };