asyncIterator.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. export default function _asyncIterator(iterable) {
  2. var method,
  3. async,
  4. sync,
  5. retry = 2;
  6. if (typeof Symbol !== "undefined") {
  7. async = Symbol.asyncIterator;
  8. sync = Symbol.iterator;
  9. }
  10. while (retry--) {
  11. if (async && (method = iterable[async]) != null) {
  12. return method.call(iterable);
  13. }
  14. if (sync && (method = iterable[sync]) != null) {
  15. return new AsyncFromSyncIterator(method.call(iterable));
  16. }
  17. async = "@@asyncIterator";
  18. sync = "@@iterator";
  19. }
  20. throw new TypeError("Object is not async iterable");
  21. }
  22. function AsyncFromSyncIterator(s) {
  23. AsyncFromSyncIterator = function AsyncFromSyncIterator(s) {
  24. this.s = s;
  25. this.n = s.next;
  26. };
  27. AsyncFromSyncIterator.prototype = {
  28. s: null,
  29. n: null,
  30. next: function next() {
  31. return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
  32. },
  33. "return": function _return(value) {
  34. var ret = this.s["return"];
  35. if (ret === undefined) {
  36. return Promise.resolve({
  37. value: value,
  38. done: true
  39. });
  40. }
  41. return AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));
  42. },
  43. "throw": function _throw(value) {
  44. var thr = this.s["return"];
  45. if (thr === undefined) return Promise.reject(value);
  46. return AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));
  47. }
  48. };
  49. function AsyncFromSyncIteratorContinuation(r) {
  50. if (Object(r) !== r) {
  51. return Promise.reject(new TypeError(r + " is not an object."));
  52. }
  53. var done = r.done;
  54. return Promise.resolve(r.value).then(function (value) {
  55. return {
  56. value: value,
  57. done: done
  58. };
  59. });
  60. }
  61. return new AsyncFromSyncIterator(s);
  62. }