简介
Promise 是 JavaScript 异步编程的一种解决方案,它能够优雅高效地处理异步操作和回调函数。Promise 对象是一个容器,里面保存着某个未来才会结束的异步操作的结果。在 Promise 对象未完成之前,可以添加回调函数,当 Promise 对象完成时,它会自动执行这些回调函数。
Promise 对象的三个状态
Promise 对象有三个状态:Pending、Fulfilled 和 Rejected。
Pending:Promise 实例刚刚被创建,它的结果尚未确定,处于等待状态。
Fulfilled:异步操作成功完成,Promise 实例的状态变为 Fulfilled,同时会保存异步操作的结果。
Rejected:异步操作失败,Promise 实例的状态变为 Rejected,同时会保存失败的原因。
Promise 对象的基本使用
使用 Promise 对象就是创建一个 Promise 对象,然后在 Promise 对象的 then 方法中添加一个成功回调和一个失败回调,当操作成功完成时,就会执行成功回调,如果操作发生错误,就会执行失败回调。
// 创建 Promise 对象 const promise = new Promise((resolve, reject) => { setTimeout(() => { const result = 100; resolve(result); }, 1000); }); // 添加回调函数 promise.then((result) => { console.log('Promise resolved with result:', result); }).catch((error) => { console.log('Promise rejected with error:', error); });
Promise 对象的进阶应用
Promise 对象有很多进阶应用,这里介绍一些常用的应用。
Promise.all()
Promise.all() 方法接收一个包含多个 Promise 实例的数组,并在所有的实例都已经完成时才返回一个新的 Promise,新的 Promise 的结果是一个数组,包含了所有实例的结果。如果其中一个实例发生错误,则该方法返回的 Promise 的状态变为 Rejected,同时会传递唯一的错误原因。
const promise1 = Promise.resolve(3); const promise2 = 42; const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([promise1, promise2, promise3]).then((values) => { console.log(values); // [3, 42, 'foo'] });
Promise.race()
Promise.race() 方法同样接收一个包含多个 Promise 实例的数组,它返回的 Promise 实例的状态是从已完成的 Promise 实例中获取的。无论是成功还是失败,只要有一个实例先完成,就会返回它的结果。
const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 500, 'one'); }); const promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'two'); }); Promise.race([promise1, promise2]).then((value) => { console.log(value); // 'two' });
Promise.resolve() 和 Promise.reject()
Promise.resolve() 方法可以将一个值转换成 Promise 对象,如果参数已经是 Promise 对象,则直接返回该对象。它通常用来在当前 Promise 对象执行完毕后,再创建一个新的 Promise 对象。
Promise.reject() 方法和 Promise.resolve() 方法类似,它用来创建一个 Promise 对象,并直接设置该对象的状态为 Rejected,同时还可以传递一个错误对象作为参数。
总结
以上就是 Promise 对象的基本使用与进阶应用。在实际的开发中,Promise 对象是非常常用的异步编程解决方案,灵活运用 Promise 对象可以提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a0c7a8add4f0e0ff8fe7a9