Promise 是一种用于异步编程的编程模型,它可以让我们更好地处理异步操作,避免回调地狱的问题。在 ES6 中,Promise 就被正式引入了 JavaScript,而在 ES12 中,Promise 又有了一些新的改进和增强。
Promise 的基本用法
Promise 的基本用法很简单,它可以接收一个函数作为参数,这个函数接收两个参数,一个是 resolve,表示异步操作成功时的回调函数,一个是 reject,表示异步操作失败时的回调函数。当异步操作完成时,我们可以调用 resolve 或 reject 函数来触发相应的回调函数。
// javascriptcn.com 代码示例 const p = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const result = Math.random() > 0.5 ? 'success' : 'error' if (result === 'success') { resolve('操作成功') } else { reject('操作失败') } }, 1000) }) p.then((data) => { console.log(data) }).catch((error) => { console.error(error) })
在上面的代码中,我们创建了一个 Promise 实例 p,它会在 1 秒后随机返回一个成功或失败的结果。我们可以使用 then 方法来注册成功时的回调函数,catch 方法来注册失败时的回调函数。
Promise.allSettled
Promise.allSettled 是 ES12 中新增的方法,它可以同时执行多个 Promise 实例,并在所有 Promise 实例完成后返回一个包含所有 Promise 实例的结果的数组。不同于 Promise.all 方法,Promise.allSettled 不会因为某个 Promise 实例失败而立即返回。
const p1 = Promise.resolve('p1') const p2 = Promise.reject('p2') const p3 = Promise.resolve('p3') Promise.allSettled([p1, p2, p3]).then((results) => { console.log(results) })
在上面的代码中,我们创建了三个 Promise 实例,并将它们作为参数传递给 Promise.allSettled 方法。在所有 Promise 实例完成后,Promise.allSettled 方法会返回一个数组,包含每个 Promise 实例的状态和结果。
Promise.any
Promise.any 是 ES12 中新增的方法,它可以同时执行多个 Promise 实例,并在其中有一个 Promise 实例成功时返回该 Promise 实例的结果。如果所有 Promise 实例都失败了,Promise.any 方法会抛出一个 AggregateError 异常。
// javascriptcn.com 代码示例 const p1 = Promise.reject('p1') const p2 = Promise.resolve('p2') const p3 = Promise.reject('p3') Promise.any([p1, p2, p3]).then((result) => { console.log(result) }).catch((error) => { console.error(error) })
在上面的代码中,我们创建了三个 Promise 实例,并将它们作为参数传递给 Promise.any 方法。在其中有一个 Promise 实例成功时,Promise.any 方法会返回该 Promise 实例的结果,如果所有 Promise 实例都失败了,Promise.any 方法会抛出一个 AggregateError 异常。
Promise.try
Promise.try 是一个实用的方法,它可以让我们更方便地使用 Promise 处理同步和异步操作。Promise.try 方法接收一个函数作为参数,这个函数可以是同步的也可以是异步的,Promise.try 方法会自动将其转换为 Promise 实例。
Promise.try(() => { console.log('同步操作') return Promise.resolve('异步操作') }).then((result) => { console.log(result) })
在上面的代码中,我们使用 Promise.try 方法来处理一个既包含同步操作又包含异步操作的函数。Promise.try 方法会自动将其转换为 Promise 实例,并在异步操作完成后返回结果。
总结
ES12 中的 Promise 增加了 Promise.allSettled、Promise.any 和 Promise.try 等新的方法,这些方法可以让我们更方便地处理异步操作。同时,我们也需要注意在使用 Promise 时避免出现回调地狱的问题,保持代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6562fed1d2f5e1655dcb7c08