【JS Promise 及手写J简单Promise】
发布人:shili8
发布时间:2025-03-10 14:39
阅读次数:0
**JS Promise 及手写一个简单的Promise**
### 前言在 JavaScript 中,异步编程是非常常见的一种需求。例如,我们可能需要从服务器获取数据、执行一些耗时的操作等。在这些场景中,使用回调函数来处理结果是很容易实现的。但是,当我们需要处理多个异步操作时,这种方式就变得非常复杂和难以维护。
为了解决这个问题,JavaScript 提供了一个称为 Promise 的 API。Promise 是一种用于表示异步操作最终结果的对象。它允许我们将回调函数注册到 Promise 上,从而在异步操作完成后执行这些回调函数。
### Promise 基础下面是 Promise 的基本结构:
javascriptclass Promise {
constructor(executor) {
// executor 是一个函数,用于定义异步操作 this.state = 'pending'; // 初始状态为 pending this.value = undefined; // 最终结果 this.reason = undefined; // 异常信息 // resolve 和 reject 是两个函数,用于将最终结果或异常传递给回调函数 let self = this;
executor(function(resolve) {
// 将 resolve 函数传递给 executor self.resolve = function(value) {
if (self.state === 'pending') {
self.value = value;
self.state = 'resolved';
self.onResolved();
}
};
}, function(reason) {
// 将 reject 函数传递给 executor self.reject = function(reason) {
if (self.state === 'pending') {
self.reason = reason;
self.state = 'rejected';
self.onRejected();
}
};
});
}
then(onResolved, onRejected) {
// 如果状态为 resolved,则执行 onResolved 回调函数 if (this.state === 'resolved') {
return Promise.resolve(onResolved(this.value));
} else if (this.state === 'rejected') {
// 如果状态为 rejected,则执行 onRejected 回调函数 return Promise.reject(onRejected(this.reason));
}
// 如果状态为 pending,则将回调函数注册到 promise 上 let self = this;
return new Promise(function(resolve, reject) {
function handle(value) {
try {
let x = onResolved ? onResolved(value) : value;
resolve(x);
} catch (e) {
reject(e);
}
}
function handleError(reason) {
try {
let x = onRejected ? onRejected(reason) : reason;
resolve(x);
} catch (e) {
reject(e);
}
}
self.onResolved = handle.bind(null, self.value);
self.onRejected = handleError.bind(null, self.reason);
// 如果状态为 resolved 或 rejected,则执行对应的回调函数 if (self.state === 'resolved') {
self.onResolved();
} else if (self.state === 'rejected') {
self.onRejected();
}
});
}
catch(onError) {
return this.then(null, onError);
}
static resolve(value) {
return new Promise(function(resolve) {
resolve(value);
});
}
static reject(reason) {
return new Promise(function(reject) {
reject(reason);
});
}
}
### 使用示例
javascript// 创建一个 promise 对象let p = new Promise((resolve, reject) => {
// 模拟异步操作 setTimeout(() => {
resolve('Hello World!');
},2000);
});
// 使用 then 方法注册回调函数p.then((value) => {
console.log(value); // Hello World!
}).catch((error) => {
console.error(error);
});
### Promise.all()
Promise.all() 是一个用于处理多个 promise 对象的方法。它会等待所有 promise 对象完成后,才将最终结果传递给回调函数。
javascript// 创建多个 promise 对象let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello World!');
},2000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hi Earth!');
},3000);
});
// 使用 Promise.all() 方法Promise.all([p1, p2]).then((values) => {
console.log(values); // ['Hello World!', 'Hi Earth!']
}).catch((error) => {
console.error(error);
});
### Promise.race()
Promise.race() 是一个用于处理多个 promise 对象的方法。它会等待第一个 promise 对象完成后,才将最终结果传递给回调函数。
javascript// 创建多个 promise 对象let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello World!');
},2000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hi Earth!');
},3000);
});
// 使用 Promise.race() 方法Promise.race([p1, p2]).then((value) => {
console.log(value); // 'Hello World!'
}).catch((error) => {
console.error(error);
});
### 总结在本文中,我们学习了 JavaScript 中的 Promise API,以及如何手写一个简单的 Promise 对象。Promise 是一种用于表示异步操作最终结果的对象,它允许我们将回调函数注册到 Promise 上,从而在异步操作完成后执行这些回调函数。
我们还学习了 Promise.all() 和 Promise.race() 方法,这些方法用于处理多个 promise 对象。Promise.all() 会等待所有 promise 对象完成后,才将最终结果传递给回调函数,而 Promise.race() 会等待第一个 promise 对象完成后,才将最终结果传递给回调函数。
通过学习这些概念和方法,我们可以更好地理解 JavaScript 中的异步编程,并且能够使用 Promise API 来处理复杂的异步操作。

