Promise
这个实现会包含Promise的基本功能,包括状态管理、then方法、resolve和reject方法。以下是一个基本的Promise实现:
class MyPromise {
constructor(executor) {
this.state = 'pending';
this.value = undefined;
this.reason = undefined;
this.onFulfilledCallbacks = [];
this.onRejectedCallbacks = [];
const resolve = (value) => {
if (this.state === 'pending') {
this.state = 'fulfilled';
this.value = value;
this.onFulfilledCallbacks.forEach(callback => callback(value));
}
};
const reject = (reason) => {
if (this.state === 'pending') {
this.state = 'rejected';
this.reason = reason;
this.onRejectedCallbacks.forEach(callback => callback(reason));
}
};
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
then(onFulfilled, onRejected) {
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value;
onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason };
const promise2 = new MyPromise((resolve, reject) => {
if (this.state === 'fulfilled') {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
}
if (this.state === 'rejected') {
setTimeout(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
}
if (this.state === 'pending') {
this.onFulfilledCallbacks.push(() => {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
this.onRejectedCallbacks.push(() => {
setTimeout(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
}
});
return promise2;
}
}
function resolvePromise(promise2, x, resolve, reject) {
if (promise2 === x) {
reject(new TypeError('Chaining cycle detected for promise'));
}
if (x && (typeof x === 'object' || typeof x === 'function')) {
let used = false;
try {
const then = x.then;
if (typeof then === 'function') {
then.call(
x,
y => {
if (used) return;
used = true;
resolvePromise(promise2, y, resolve, reject);
},
r => {
if (used) return;
used = true;
reject(r);
}
);
} else {
resolve(x);
}
} catch (error) {
if (used) return;
used = true;
reject(error);
}
} else {
resolve(x);
}
}
这个实现包括以下主要部分:
构造函数:初始化Promise的状态和相关属性。
resolve和reject方法:用于改变Promise的状态和设置结果值。
then方法:返回一个新的Promise,并处理回调函数。
resolvePromise函数:处理Promise的解析过程,确保正确处理各种情况。
这个实现涵盖了Promise的基本功能,但还不包括catch、finally等方法。你可以根据需要进一步扩展这个实现。
要使用这个MyPromise,你可以这样做:
const promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
resolve('Success!');
}, 1000);
});
promise.then(
value => console.log(value),
reason => console.error(reason)
);
这个实现应该能够处理大多数基本的Promise用例。