UNPKG

2.67 kBJavaScriptView Raw
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._n);
20 p._i = 1;
21 p._j = 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._i === 3) {
59 val = val._j;
60 }
61 if (val._i === 1) return res(i, val._j);
62 if (val._i === 2) reject(val._j);
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};