1'use strict'; 2 3//This file contains the ES6 extensions to the core Promises/A+ API 4 5var Promise = require('./core.js'); 6 7module.exports = Promise; 8 9/* Static Functions */ 10 11var TRUE = valuePromise(true); 12var FALSE = valuePromise(false); 13var NULL = valuePromise(null); 14var UNDEFINED = valuePromise(undefined); 15var ZERO = valuePromise(0); 16var EMPTYSTRING = valuePromise(''); 17 18function valuePromise(value) { 19 var p = new Promise(Promise._noop); 20 p._state = 1; 21 p._value = value; 22 return p; 23} 24Promise.resolve = function (value) { 25 if (value instanceof Promise) return value; 26 27 if (value === null) return NULL; 28 if (value === undefined) return UNDEFINED; 29 if (value === true) return TRUE; 30 if (value === false) return FALSE; 31 if (value === 0) return ZERO; 32 if (value === '') return EMPTYSTRING; 33 34 if (typeof value === 'object' || typeof value === 'function') { 35 try { 36 var then = value.then; 37 if (typeof then === 'function') { 38 return new Promise(then.bind(value)); 39 } 40 } catch (ex) { 41 return new Promise(function (resolve, reject) { 42 reject(ex); 43 }); 44 } 45 } 46 return valuePromise(value); 47}; 48 49Promise.all = function (arr) { 50 var args = Array.prototype.slice.call(arr); 51 52 return new Promise(function (resolve, reject) { 53 if (args.length === 0) return resolve([]); 54 var remaining = args.length; 55 function res(i, val) { 56 if (val && (typeof val === 'object' || typeof val === 'function')) { 57 if (val instanceof Promise && val.then === Promise.prototype.then) { 58 while (val._state === 3) { 59 val = val._value; 60 } 61 if (val._state === 1) return res(i, val._value); 62 if (val._state === 2) reject(val._value); 63 val.then(function (val) { 64 res(i, val); 65 }, reject); 66 return; 67 } else { 68 var then = val.then; 69 if (typeof then === 'function') { 70 var p = new Promise(then.bind(val)); 71 p.then(function (val) { 72 res(i, val); 73 }, reject); 74 return; 75 } 76 } 77 } 78 args[i] = val; 79 if (--remaining === 0) { 80 resolve(args); 81 } 82 } 83 for (var i = 0; i < args.length; i++) { 84 res(i, args[i]); 85 } 86 }); 87}; 88 89Promise.reject = function (value) { 90 return new Promise(function (resolve, reject) { 91 reject(value); 92 }); 93}; 94 95Promise.race = function (values) { 96 return new Promise(function (resolve, reject) { 97 values.forEach(function(value){ 98 Promise.resolve(value).then(resolve, reject); 99 }); 100 }); 101}; 102 103/* Prototype Methods */ 104 105Promise.prototype['catch'] = function (onRejected) { 106 return this.then(null, onRejected); 107}; 108