AsyncGenerator.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = AsyncGenerator;
  6. var _OverloadYield = require("OverloadYield");
  7. function AsyncGenerator(gen) {
  8. var front, back;
  9. function send(key, arg) {
  10. return new Promise(function (resolve, reject) {
  11. var request = {
  12. key: key,
  13. arg: arg,
  14. resolve: resolve,
  15. reject: reject,
  16. next: null
  17. };
  18. if (back) {
  19. back = back.next = request;
  20. } else {
  21. front = back = request;
  22. resume(key, arg);
  23. }
  24. });
  25. }
  26. function resume(key, arg) {
  27. try {
  28. var result = gen[key](arg);
  29. var value = result.value;
  30. var overloaded = value instanceof _OverloadYield;
  31. Promise.resolve(overloaded ? value.v : value).then(function (arg) {
  32. if (overloaded) {
  33. var nextKey = key === "return" ? "return" : "next";
  34. if (!value.k || arg.done) {
  35. return resume(nextKey, arg);
  36. } else {
  37. arg = gen[nextKey](arg).value;
  38. }
  39. }
  40. settle(result.done ? "return" : "normal", arg);
  41. }, function (err) {
  42. resume("throw", err);
  43. });
  44. } catch (err) {
  45. settle("throw", err);
  46. }
  47. }
  48. function settle(type, value) {
  49. switch (type) {
  50. case "return":
  51. front.resolve({
  52. value: value,
  53. done: true
  54. });
  55. break;
  56. case "throw":
  57. front.reject(value);
  58. break;
  59. default:
  60. front.resolve({
  61. value: value,
  62. done: false
  63. });
  64. break;
  65. }
  66. front = front.next;
  67. if (front) {
  68. resume(front.key, front.arg);
  69. } else {
  70. back = null;
  71. }
  72. }
  73. this._invoke = send;
  74. if (typeof gen.return !== "function") {
  75. this.return = undefined;
  76. }
  77. }
  78. AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
  79. return this;
  80. };
  81. AsyncGenerator.prototype.next = function (arg) {
  82. return this._invoke("next", arg);
  83. };
  84. AsyncGenerator.prototype.throw = function (arg) {
  85. return this._invoke("throw", arg);
  86. };
  87. AsyncGenerator.prototype.return = function (arg) {
  88. return this._invoke("return", arg);
  89. };
  90. //# sourceMappingURL=AsyncGenerator.js.map