Make stdlib classes uniform
This commit is contained in:
+39
-39
@@ -20,8 +20,7 @@ const __PENDING = 0;
|
||||
const __FULFILLED = 1;
|
||||
const __REJECTED = 2;
|
||||
|
||||
class Promise {
|
||||
constructor(executor) {
|
||||
function Promise(executor) {
|
||||
const p = { __proto__: this.__proto__, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
|
||||
if (executor !== undefined) {
|
||||
@@ -29,8 +28,43 @@ class Promise {
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
Promise.resolve = function (value) {
|
||||
if (__is_promise(value)) return value;
|
||||
const p = { __proto__: this.prototype, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
__resolve(p, value);
|
||||
return p;
|
||||
};
|
||||
|
||||
Promise.reject = function (reason) {
|
||||
const p = { __proto__: this.prototype, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
__reject(p, reason);
|
||||
return p;
|
||||
};
|
||||
|
||||
Promise.all = function (promises) {
|
||||
const p = { __proto__: this.prototype, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
const values = [];
|
||||
let left = promises.length;
|
||||
|
||||
if (left === 0) __resolve(p, values);
|
||||
|
||||
for (let i = 0; i < promises.length; i++) {
|
||||
Promise.resolve(promises[i]).then(
|
||||
(value) => {
|
||||
values[i] = value;
|
||||
left--;
|
||||
if (left === 0) __resolve(p, values);
|
||||
},
|
||||
(reason) => __reject(p, reason),
|
||||
);
|
||||
}
|
||||
|
||||
return p;
|
||||
};
|
||||
|
||||
Promise.prototype = {
|
||||
then(onFulfilled, onRejected) {
|
||||
const derived = { __proto__: this.__proto__, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
let value;
|
||||
@@ -68,11 +102,11 @@ class Promise {
|
||||
}
|
||||
|
||||
return derived;
|
||||
}
|
||||
},
|
||||
|
||||
catch(onRejected) {
|
||||
return this.then(undefined, onRejected);
|
||||
}
|
||||
},
|
||||
|
||||
finally(f) {
|
||||
return this.then(
|
||||
@@ -85,42 +119,8 @@ class Promise {
|
||||
return Promise.reject(reason);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
static resolve(value) {
|
||||
if (__is_promise(value)) return value;
|
||||
const p = { __proto__: this.prototype, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
__resolve(p, value);
|
||||
return p;
|
||||
}
|
||||
|
||||
static reject(reason) {
|
||||
const p = { __proto__: this.prototype, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
__reject(p, reason);
|
||||
return p;
|
||||
}
|
||||
|
||||
static all(promises) {
|
||||
const p = { __proto__: this.prototype, state: __PENDING, value: undefined, reason: undefined, resolved: false, reactions: [] };
|
||||
const values = [];
|
||||
let left = promises.length;
|
||||
|
||||
if (left === 0) __resolve(p, values);
|
||||
|
||||
for (let i = 0; i < promises.length; i++) {
|
||||
Promise.resolve(promises[i]).then(
|
||||
(value) => {
|
||||
values[i] = value;
|
||||
left--;
|
||||
if (left === 0) __resolve(p, values);
|
||||
},
|
||||
(reason) => __reject(p, reason),
|
||||
);
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function __is_promise(x) {
|
||||
return typeof x === "object" && x !== null && x.reactions !== undefined;
|
||||
|
||||
Reference in New Issue
Block a user