| /** |
| @license |
| Copyright (c) 2016 The Polymer Project Authors. All rights reserved. |
| This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
| The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
| The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
| Code distributed by Google as part of the polymer project is also |
| subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
| */ |
| Promise.all = Promise.all || function () { |
| var args = Array.prototype.slice.call(arguments.length === 1 && Array.isArray(arguments[0]) ? arguments[0] : arguments); |
| |
| return new Promise(function (resolve, reject) { |
| if (args.length === 0) return resolve([]); |
| var remaining = args.length; |
| function res(i, val) { |
| try { |
| if (val && (typeof val === 'object' || typeof val === 'function')) { |
| var then = val.then; |
| if (typeof then === 'function') { |
| then.call(val, function (val) { res(i, val) }, reject); |
| return; |
| } |
| } |
| args[i] = val; |
| if (--remaining === 0) { |
| resolve(args); |
| } |
| } catch (ex) { |
| reject(ex); |
| } |
| } |
| for (var i = 0; i < args.length; i++) { |
| res(i, args[i]); |
| } |
| }); |
| }; |
| |
| Promise.race = Promise.race || function(values) { |
| // TODO(bradfordcsmith): To be consistent with the ECMAScript spec, this |
| // method should take any iterable, not just an array. |
| var forcedArray = /** @type {!Array<!Thenable>} */ (values); |
| return new Promise(function (resolve, reject) { |
| for(var i = 0, len = forcedArray.length; i < len; i++) { |
| forcedArray[i].then(resolve, reject); |
| } |
| }); |
| }; |
| |