Blame view

node_modules/bluebird/js/release/props.js 3.04 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  "use strict";
  module.exports = function(
      Promise, PromiseArray, tryConvertToPromise, apiRejection) {
  var util = require("./util");
  var isObject = util.isObject;
  var es5 = require("./es5");
  var Es6Map;
  if (typeof Map === "function") Es6Map = Map;
  
  var mapToEntries = (function() {
      var index = 0;
      var size = 0;
  
      function extractEntry(value, key) {
          this[index] = value;
          this[index + size] = key;
          index++;
      }
  
      return function mapToEntries(map) {
          size = map.size;
          index = 0;
          var ret = new Array(map.size * 2);
          map.forEach(extractEntry, ret);
          return ret;
      };
  })();
  
  var entriesToMap = function(entries) {
      var ret = new Es6Map();
      var length = entries.length / 2 | 0;
      for (var i = 0; i < length; ++i) {
          var key = entries[length + i];
          var value = entries[i];
          ret.set(key, value);
      }
      return ret;
  };
  
  function PropertiesPromiseArray(obj) {
      var isMap = false;
      var entries;
      if (Es6Map !== undefined && obj instanceof Es6Map) {
          entries = mapToEntries(obj);
          isMap = true;
      } else {
          var keys = es5.keys(obj);
          var len = keys.length;
          entries = new Array(len * 2);
          for (var i = 0; i < len; ++i) {
              var key = keys[i];
              entries[i] = obj[key];
              entries[i + len] = key;
          }
      }
      this.constructor$(entries);
      this._isMap = isMap;
      this._init$(undefined, isMap ? -6 : -3);
  }
  util.inherits(PropertiesPromiseArray, PromiseArray);
  
  PropertiesPromiseArray.prototype._init = function () {};
  
  PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
      this._values[index] = value;
      var totalResolved = ++this._totalResolved;
      if (totalResolved >= this._length) {
          var val;
          if (this._isMap) {
              val = entriesToMap(this._values);
          } else {
              val = {};
              var keyOffset = this.length();
              for (var i = 0, len = this.length(); i < len; ++i) {
                  val[this._values[i + keyOffset]] = this._values[i];
              }
          }
          this._resolve(val);
          return true;
      }
      return false;
  };
  
  PropertiesPromiseArray.prototype.shouldCopyValues = function () {
      return false;
  };
  
  PropertiesPromiseArray.prototype.getActualLength = function (len) {
      return len >> 1;
  };
  
  function props(promises) {
      var ret;
      var castValue = tryConvertToPromise(promises);
  
      if (!isObject(castValue)) {
          return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
      } else if (castValue instanceof Promise) {
          ret = castValue._then(
              Promise.props, undefined, undefined, undefined, undefined);
      } else {
          ret = new PropertiesPromiseArray(castValue).promise();
      }
  
      if (castValue instanceof Promise) {
          ret._propagateFrom(castValue, 2);
      }
      return ret;
  }
  
  Promise.prototype.props = function () {
      return props(this);
  };
  
  Promise.props = function (promises) {
      return props(promises);
  };
  };