You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							119 lines
						
					
					
						
							3.0 KiB
						
					
					
				
			
		
		
	
	
							119 lines
						
					
					
						
							3.0 KiB
						
					
					
				| "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);
 | |
| };
 | |
| };
 |