介绍
在 ECMAScript 2015 (ES6) 中,Promise 被引入作为处理异步操作的一种方式。Promise 是一种代表异步操作结果的对象,它可以是已经完成的、正在进行中的或者失败的状态。通过 Promise,我们可以更加优雅地处理异步操作,避免了回调地狱的问题。
在 ECMAScript 2020 (ES11) 中,Promise 进行了一些新的功能和改进,这些改进可以让我们更加方便地使用 Promise,并且让 Promise 更加灵活。
新功能和改进
Promise.allSettled()
Promise.allSettled() 方法返回一个 Promise,该 Promise 在所有给定的 Promise 都已经解决或被拒绝后解析为一个对象数组,每个对象表示对应的 Promise 的解决或拒绝结果。
这个新的方法可以让我们更加容易地处理多个 Promise 的结果,而不需要在其中任何一个 Promise 失败时立即退出。
例如,在下面的示例中,我们同时发起了三个异步请求,然后使用 Promise.allSettled() 来等待所有请求完成:
// javascriptcn.com 代码示例 const promises = [ fetch('https://jsonplaceholder.typicode.com/todos/1'), fetch('https://jsonplaceholder.typicode.com/todos/2'), fetch('https://jsonplaceholder.typicode.com/todos/3') ]; Promise.allSettled(promises) .then(results => { results.forEach(result => { console.log(result.status); console.log(result.value); }); });
Promise.any()
Promise.any() 方法返回一个 Promise,该 Promise 在给定的 Promise 中有任何一个解决后立即解决,并将该 Promise 的解决值传递给回调函数。如果所有 Promise 都被拒绝,则返回一个 AggregateError,其中包含所有 Promise 的拒绝原因。
这个新的方法可以让我们更加容易地处理多个 Promise 的结果,而不需要等待所有 Promise 都完成。
例如,在下面的示例中,我们同时发起了三个异步请求,然后使用 Promise.any() 来等待任何一个请求完成:
// javascriptcn.com 代码示例 const promises = [ fetch('https://jsonplaceholder.typicode.com/todos/1'), fetch('https://jsonplaceholder.typicode.com/todos/2'), fetch('https://jsonplaceholder.typicode.com/todos/3') ]; Promise.any(promises) .then(result => { console.log(result.status); console.log(result.value); });
Promise.prototype.finally()
Promise.prototype.finally() 方法在 Promise 解决或拒绝后执行一个回调函数,该回调函数不接受任何参数,只是执行一些清理操作。
这个新的方法可以让我们更加方便地执行一些清理操作,而不需要在 then() 和 catch() 方法中重复代码。
例如,在下面的示例中,我们使用 Promise.prototype.finally() 来记录 Promise 的结束时间:
// javascriptcn.com 代码示例 const startTime = new Date(); fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)) .finally(() => { const endTime = new Date(); console.log(`请求结束时间:${endTime}`); });
总结
ECMAScript 2020 (ES11) 中的 Promise 新功能和改进可以让我们更加方便地处理异步操作,并且让 Promise 更加灵活。我们可以使用 Promise.allSettled() 来等待多个 Promise 的结果,使用 Promise.any() 来等待任何一个 Promise 的结果,使用 Promise.prototype.finally() 来执行一些清理操作。这些新的方法可以让我们更加优雅地处理异步操作,避免了回调地狱的问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655b0354d2f5e1655d52e12b