AsyncGenerator.js 2.1 KB

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