Projekt

Obecné

Profil

Stáhnout (2 KB) Statistiky
| Větev: | Revize:
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;
(1-1/80)