在前端编程中,Promise 是一种非常强大的异步编程方式,它可以帮助我们更方便地处理异步操作,使得代码更加清晰、简洁。ES2020 引入了全局 Promise 对象,提供了更多的方法和功能,使得 Promise 的使用更加灵活方便。本文将介绍 ES2020 的全局 Promise 对象,包括常用的方法和使用技巧。
Promise 对象简介
Promise 对象是异步编程的一种解决方案,它是一种代表异步操作最终完成或失败的对象。Promise 对象有三种状态:等待(pending)、已完成(fulfilled)和已拒绝(rejected)。一旦 Promise 对象的状态变为已完成或已拒绝,就不会再变化。
-- -------------------- ---- ------- ----- ------- - --- ----------------- ------- -- - ------------- -- - ------------------- -- ------ --- -------------------- -- - ------------------- ---------------- -- - ------------------- ---
上面的代码创建了一个 Promise 对象,1 秒钟后,这个 Promise 对象的状态变为已完成,并返回一个值为 'success' 的结果。调用 then 方法可以得到这个结果。
ES2020 的全局 Promise 对象
ES2020 引入了全局 Promise 对象,相比于直接使用 Promise 构造函数创建 Promise 对象,全局 Promise 对象提供了更多的方法和功能,使得 Promise 的使用更加灵活方便。以下是常用的全局 Promise 方法:
Promise.any
Promise.any 方法接收一个 Promise 数组,如果其中的任意一个 Promise 对象变为已完成状态,就返回这个已完成的 Promise 对象的结果值。如果所有的 Promise 对象都被拒绝,就返回一个 AggregateError 对象,其中包含所有被拒绝的 Promise 对象的错误信息。
const promises = [ new Promise((resolve, reject) => setTimeout(reject, 1000, 'one')), new Promise((resolve, reject) => setTimeout(resolve, 500, 'two')), new Promise((resolve, reject) => setTimeout(reject, 2000, 'three')) ]; Promise.any(promises).then((value) => console.log(value)) .catch((error) => console.log(error)); // 'two'
Promise.allSettled
Promise.allSettled 方法接收一个 Promise 数组,等待所有的 Promise 对象都变为已完成或已拒绝状态,然后返回一个数组,其中包含每个 Promise 对象的结果或错误信息。如果所有的 Promise 对象都被解决,返回的数组中的对象都有一个 status 属性,它的值可以是 'fulfilled' 或 'rejected'。
const promises = [ new Promise((resolve, reject) => setTimeout(reject, 1000, 'error')), new Promise((resolve, reject) => setTimeout(resolve, 500, 'success')) ]; Promise.allSettled(promises).then((results) => console.log(results)); // [{status: 'rejected', reason: 'error'}, {status: 'fulfilled', value: 'success'}]
Promise.try
Promise.try 方法接收一个函数,并立即调用这个函数,并在 Promise 对象中对它进行封装。如果函数返回一个 Promise 对象,则 Promise.try 方法返回的 Promise 对象就直接返回该 Promise 对象的结果。如果函数没有返回 Promise 对象,则 Promise.try 方法返回的 Promise 对象将使用函数的返回值作为 Promise 对象的结果。
Promise.try(() => Promise.resolve('success')).then((value) => console.log(value)); // 'success' Promise.try(() => 'success').then((value) => console.log(value)); // 'success'
Promise 对象的使用技巧
除了全局 Promise 对象提供的方法,Promise 对象本身也有一些使用技巧,下面是几个例子:
Promise.race
Promise.race 方法接收一个 Promise 数组,返回第一个已完成或已拒绝的 Promise 对象的结果。
const promises = [ new Promise((resolve) => setTimeout(resolve, 1000, 'one')), new Promise((resolve) => setTimeout(resolve, 500, 'two')), new Promise((resolve) => setTimeout(resolve, 2000, 'three')) ]; Promise.race(promises).then((value) => console.log(value)); // 'two'
Promise.resolve 和 Promise.reject
Promise.resolve 方法返回一个已解决的 Promise 对象,可以传递一个值作为 Promise 对象的结果。
Promise.resolve('success').then((value) => console.log(value)); // 'success'
Promise.reject 方法返回一个已拒绝的 Promise 对象,可以传递一个错误作为 Promise 对象的拒绝原因。
Promise.reject(new Error('fail')).catch((error) => console.log(error)); // Error: fail
Promise.prototype.finally
Promise.prototype.finally 方法接收一个回调函数,该函数在 Promise 对象变为已完成或已拒绝状态时都会被调用。
Promise.resolve('success').finally(() => console.log('finally')); // 'finally' Promise.reject(new Error('fail')).finally(() => console.log('finally')); // 'finally'
结论
ES2020 的全局 Promise 对象提供了更多的方法和功能,使得 Promise 的使用更加灵活方便。在进行异步编程时,尽量使用 Promise 对象和全局 Promise 方法,能够考虑和处理更多的情况,提高代码的可读性和可维护性。
参考文献
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672ff453eedcc8a97c90b79b