1、
2、
3、
4、
/***
* 原生promise
* @param promise2
* @param x
* @param resole
* @param reject
* @returns {*}
*/
function resolvePromise(promise2, x, resole, reject) {
if (promise2 === x) {
return reject(new Error("循环引用"));
}
if (typeof x === "function" || (typeof x === "object" && x !== null)) {
var called;
try {
let then = x.then;
if (typeof then === "function") {
then.call(function (x, y) {
if (called) return;
called = true;
resolvePromise(promise2, y, resole, reject);
}, function (r) {
if (called) return;
called = true;
reject(r);
})
} else {
resole(x);
}
} catch (e) {
if (called) return;
called = true;
reject(e);
}
} else {
resole(x);
}
}
function Promise(executor) {
this.value = "";
this.reason = "";
this.status = "pending";
this.resolveCallbacks = [];
this.rejectedCallbacks = [];
try {
executor(this.resolve.bind(this), this.reject.bind(this))
} catch (e) {
this.reject.call(this, e);
}
}
Promise.prototype.resolve = function (value) {
if (this.status === "pending") {
this.status = "fulfilled";
this.value = value;
for (var i = 0; i < this.resolveCallbacks.length; i++) {
this.resolveCallbacks[i]();
}
}
};
Promise.prototype.reject = function (reason) {
if (this.status === 'pending') {
this.status = "rejected";
this.reason = reason;
for (var i = 0; i < this.rejectedCallbacks.length; i++) {
this.rejectedCallbacks[i]();
}
}
};
Promise.prototype.then = function (onfulfilled, onrejected) {
var promise2, _this = this;
promise2 = new Promise(function (resolve, reject) {
if (_this.status === "fulfilled") {
setTimeo