function MyPromise(executor) {
this.state = "pending";
this.value = "";
this.reason = "";
const self = this;
this.onResolvedCallbacks = []
this.onRejectedCallbacks = [];
function resolved(val) {
if (self.state === "pending") {
self.state === "resolved";
self.value = val;
self.onResolvedCallbacks.forEach(callbacks => callbacks(self.value));
}
}
function rejected(reason) {
if (self.state === "pending") {
self.state === "rejected";
self.reason = reason;
self.onRejectedCallbacks.forEach(callbacks => callbacks(self.reason));
}
}
try {
executor(resolved, rejected);
} catch (e) {
rejected(e);
}
}
MyPromise.prototype.then = function (onFulfilled, onRejected) {
onFulfilled =
typeof onFulfilled === "function"
? onFulfilled
: function (value) {
return value;
};
onRejected =
typeof onRejected === "function"
? onRejected
: function (value) {
return value;
};
const self = this;
return new MyPromise((resolve, rejected) => {
const decorateOnFulfilled = function() {
try {
const result = onFulfilled(self.value);
return result instanceof MyPromise ? result.then(resolve, rejected) : resolve(result);
} catch(e) {
rejected(e);
}
}
const decorateOnRejected = function() {
try {
const result = onRejected(self.reason);
return result instanceof MyPromise ? result.then(resolve, rejected) : rejected(result);
} catch(e) {
rejected(e);
}
}
if (self.state === 'resolved') {
decorateOnFulfilled(self.value);
}
if (self.state === 'rejected') {
decorateOnRejected(self.reason);
}
if (self.state === 'pending') {
self.onResolvedCallbacks.push(decorateOnFulfilled);
self.onRejectedCallbacks.push(decorateOnRejected);
}
})
};
MyPromise.resolve = function(val) {
if (val instanceof MyPromise) {
return val;
} else {
return new MyPromise((resolve) => resolve(val))
}
}
MyPromise.all = function(promiseArr) {
if (!Array.isArray(promiseArr)) {
console.error('入参必须是数组');
return;
}
let resultCount = 0;
const resultArr = [];
return new MyPromise((resolve, rejected) => {
promiseArr.forEach(promiseItem => {
MyPromise.resolve(promiseItem).then((value) => {
resultCount += 1;
resultArr.push(value);
if (resultCount === promiseArr.length) {
resolve(resultArr);
}
}, (reason) => {
rejected(reason);
})
})
})
}
MyPromise.race = function(promiseArr) {
if (!Array.isArray(promiseArr)) {
console.error('入参必须是数组');
return;
}
return new MyPromise((resolve, reject) => {
promiseArr.forEach((promiseItem) => {
try {
MyPromise.resolve(promiseItem).then((value) => {
resolve(value);
}, (reason) => {
reject(reason);
})
} catch(e) {
reject(e);
}
})
})
}
const p1 = new MyPromise((resolve, rejected) => {
console.log("promise-executor: 我是立即执行的");
setTimeout(() => {
resolve("resolved val 300ms");
}, 300);
});
const p2 = new MyPromise((resolve, rejected) => {
setTimeout(() => {
resolve("resolved val 400ms");
}, 400);
});
p1.then(
(res) => {
console.log("promise-fullfiled:", res);
},
(res) => {
console.log("rejected res:", res);
}
);
p1.then((res) => {
return 'fullfiled res - then res';
}).then((res) => console.log("promise-then-then:", res));
MyPromise.all([p1, p2]).then((res) => {
console.log("promise-all: promiseRes", res);
});
MyPromise.race([p1, p2]).then((res) => {
console.log("promise-race: promiseRes", res);
});
console