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