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