Promise 是 JavaScript 中比较常用的异步编程方式之一,其状态及状态之间的转换是 Promise 对象的重要特性,也是使用 Promise 进行异步编程的基础。在本文中,我们会详细介绍 Promise 对象的状态及状态之间的转换,并针对状态转换的过程提供一些指导性建议,帮助读者更好地掌握 Promise 对象的使用。
Promise 对象的状态
Promise 对象有三种状态:
pending(初始状态)fulfilled(操作成功完成)rejected(操作失败)
当 Promise 对象处于 pending 状态时,表示异步操作正在进行中,无法确定最终结果。
当 Promise 对象处于 fulfilled 状态时,表示异步操作已经成功完成,并返回了一个值。
当 Promise 对象处于 rejected 状态时,表示异步操作已经失败,并返回了一个错误信息。
Promise 对象的状态之间的转换
Promise 对象的状态之间存在以下几种转换:
pending 转换为 fulfilled
当 Promise 对象所代表的异步操作成功完成时,Promise 对象的状态会从 pending 转换为 fulfilled。此时,Promise 对象的 then 方法会被触发,执行成功回调函数,并将异步操作的结果传递给回调函数。
示例代码:
// www.javascriptcn.com code example
const promise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
resolve('操作成功');
}, 1000);
});
promise.then((result) => {
console.log(result); // '操作成功'
});pending 转换为 rejected
当 Promise 对象所代表的异步操作失败时,Promise 对象的状态会从 pending 转换为 rejected。此时,Promise 对象的 catch 方法会被触发,执行失败回调函数,并将错误信息传递给回调函数。
示例代码:
// www.javascriptcn.com code example
const promise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
reject(new Error('操作失败'));
}, 1000);
});
promise.catch((error) => {
console.log(error.message); // '操作失败'
});fulfilled 转换为 pending/rejected
当 Promise 对象的状态从 fulfilled 转换为其他状态时,Promise 对象的状态会一直保持 fulfilled。
示例代码:
// www.javascriptcn.com code example
const promise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
resolve('操作成功');
}, 1000);
});
promise
.then((result) => {
console.log(result); // '操作成功'
throw new Error('故意抛出错误');
})
.catch((error) => {
console.log(error.message); // '故意抛出错误'
});当 Promise 对象的状态从 fulfilled 转换为 pending 时,表示异步操作仍在进行中。在这种情况下,Promise 对象仍然是 fulfilled 状态。
示例代码:
// www.javascriptcn.com code example
const promise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
resolve('操作成功');
}, 1000);
});
promise.then((result) => {
console.log(result); // '操作成功'
});
console.log(promise); // Promise {<pending>}rejected 转换为 pending/fulfilled
当 Promise 对象的状态从 rejected 转换为其他状态时,Promise 对象的状态会一直保持 rejected。
示例代码:
// www.javascriptcn.com code example
const promise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
reject(new Error('操作失败'));
}, 1000);
});
promise
.catch((error) => {
console.log(error.message); // '操作失败'
return '捕获错误并返回值';
})
.then((result) => {
console.log(result); // '捕获错误并返回值'
});当 Promise 对象的状态从 rejected 转换为 pending 时,表示异步操作正在进行中。在这种情况下,Promise 对象仍然是 rejected 状态。
示例代码:
// www.javascriptcn.com code example
const promise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
reject(new Error('操作失败'));
}, 1000);
});
promise.catch((error) => {
console.log(error.message); // '操作失败'
});
console.log(promise); // Promise {<rejected>}状态转换的建议
针对 Promise 对象的状态转换,我们提供以下几个建议:
在 Promise 对象的
then和catch方法中一定要返回值。否则,Promise 对象的状态可能会转换为pending。在 Promise 对象的
then和catch方法中避免抛出错误。否则,Promise 对象的状态可能会转换为rejected。避免在 Promise 对象的回调函数中使用
setTimeout或setInterval等定时器,以避免 Promise 对象的状态转换不符合预期。
结语
本文针对 Promise 对象的状态及状态之间的转换进行了详细地介绍,并提供了一些建议,帮助读者更好地掌握 Promise 对象的使用。在日常开发中,开发者应该注意 Promise 对象的状态,及时捕获异常并处理,避免 Promise 对象状态转换不符合预期的情况出现。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bd90bca231b2b7ed0292a8