源码实现promise
时间: 2023-10-15 19:24:53 浏览: 62
你可以使用 JavaScript 来实现一个简单的 Promise,以下是一个基本的示例:
```javascript
class MyPromise {
constructor(executor) {
this.state = "pending";
this.value = null;
this.callbacks = [];
const resolve = (value) => {
if (this.state === "pending") {
this.state = "fulfilled";
this.value = value;
this.callbacks.forEach((callback) => this.executeCallback(callback));
}
};
const reject = (reason) => {
if (this.state === "pending") {
this.state = "rejected";
this.value = reason;
this.callbacks.forEach((callback) => this.executeCallback(callback));
}
};
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
then(onFulfilled, onRejected) {
return new MyPromise((resolve, reject) => {
const callback = { onFulfilled, onRejected, resolve, reject };
if (this.state === "pending") {
this.callbacks.push(callback);
} else {
this.executeCallback(callback);
}
});
}
executeCallback(callback) {
const { onFulfilled, onRejected, resolve, reject } = callback;
if (this.state === "fulfilled") {
if (typeof onFulfilled === "function") {
try {
const result = onFulfilled(this.value);
resolve(result);
} catch (error) {
reject(error);
}
} else {
resolve(this.value);
}
}
if (this.state === "rejected") {
if (typeof onRejected === "function") {
try {
const result = onRejected(this.value);
resolve(result);
} catch (error) {
reject(error);
}
} else {
reject(this.value);
}
}
}
catch(onRejected) {
return this.then(null, onRejected);
}
static resolve(value) {
return new MyPromise((resolve) => resolve(value));
}
static reject(reason) {
return new MyPromise((_, reject) => reject(reason));
}
static all(promises) {
return new MyPromise((resolve, reject) => {
const results = [];
let completedPromises = 0;
promises.forEach((promise, index) => {
promise.then((result) => {
results[index] = result;
completedPromises++;
if (completedPromises === promises.length) {
resolve(results);
}
}).catch(reject);
});
});
}
static race(promises) {
return new MyPromise((resolve, reject) => {
promises.forEach((promise) => {
promise.then(resolve).catch(reject);
});
});
}
}
```
这个实现包括了基本的 Promise 功能,包括状态的转换、通过 `then` 方法链式调用、错误处理等。同时还包括了静态方法 `resolve`、`reject`、`all` 和 `race`,用于创建和操作 Promise 实例。
请注意,这只是一个简单的 Promise 实现,可能不支持一些高级功能,如异步任务的调度、微任务队列等。在实际项目中,建议使用原生的 Promise 或第三方库来处理 Promise。