面试题答案
一键面试Promise的三种状态
- Pending(进行中):初始状态,既不是成功,也不是失败状态。在这个状态下,Promise可能正在等待某个异步操作完成,比如网络请求、文件读取等。
- Fulfilled(已成功):意味着操作成功完成。当Promise进入这个状态时,会携带一个成功的值(resolved value),这个值可以是任何JavaScript数据类型,如字符串、数字、对象等。
- Rejected(已失败):表示操作失败。进入此状态时,Promise会携带一个表示失败原因的拒绝理由(reason),通常是一个错误对象,用于描述操作失败的原因。
创建Promise实例
在JavaScript中,可以使用new Promise()
构造函数来创建一个Promise实例。Promise
构造函数接受一个执行器函数作为参数,该执行器函数会立即被调用。执行器函数接受两个参数:resolve
和reject
。
const myPromise = new Promise((resolve, reject) => {
// 异步操作,例如模拟一个延迟操作
setTimeout(() => {
const success = true;
if (success) {
resolve('操作成功');
} else {
reject(new Error('操作失败'));
}
}, 1000);
});
处理Promise成功和失败的情况
- 使用
.then()
方法:Promise实例上的.then()
方法用于处理Promise成功(Fulfilled
)和失败(Rejected
)的情况。.then()
方法接受两个回调函数作为参数,第一个回调函数用于处理成功的情况,第二个回调函数(可选)用于处理失败的情况。
myPromise
.then((result) => {
console.log(result); // 输出:操作成功
})
.catch((error) => {
console.error(error.message); // 如果操作失败,输出错误信息
});
- 使用
.catch()
方法:.catch()
方法是.then(null, rejectionHandler)
的语法糖,专门用于捕获Promise被拒绝时的错误。这样可以使代码更简洁,特别是当只关注错误处理时。
myPromise
.then((result) => {
console.log(result); // 输出:操作成功
})
.catch((error) => {
console.error(error.message); // 如果操作失败,输出错误信息
});
- 链式调用:
.then()
方法返回一个新的Promise,这使得可以进行链式调用,在成功处理后继续进行其他异步操作。
myPromise
.then((result) => {
console.log(result); // 输出:操作成功
return '新的成功值';
})
.then((newResult) => {
console.log(newResult); // 输出:新的成功值
})
.catch((error) => {
console.error(error.message); // 如果操作失败,输出错误信息
});