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