介绍
Promise.prototype.finally() 是 ECMAScript 2018 中新增的方法,它可以在 Promise 的状态发生变化之后,无论是 resolve 还是 reject,都会执行相应的代码。Promise.prototype.finally() 可以用于处理一些资源释放、清理的场合,以及代码的统一处理等等。
使用方式
Promise.prototype.finally() 方法接收一个函数作为参数,当 Promise 实例状态改变时,该函数会被调用。无论 Promise 实例是 resolve 还是 reject,都会执行相应的代码。
例如:
-- -------------------- ---- ------- ----------------------- ----------- -- - ---------------------- -- ------------- -- - ---------------------- -- ------ -- -------------- -- - ---------------------- -- ------ --
上述代码输出:
finally resolved: done
注意事项
1. finally() 方法返回一个新的 Promise 对象
注意到 finally() 方法返回的是一个新的 Promise 实例,一旦 finally() 方法被调用,它会在原有的 Promise 对象之后再返回一个新的 Promise 对象,并且这个新的 Promise 对象的状态是原有的 Promise 对象的状态。
例如:
-- -------------------- ---- ------- ------------------ -------------- ----------- -- - ---------------------- -- ------------- -- - ---------------------- -- ------ -- -------------- -- - ---------------------- -- ------ --
上述代码输出:
finally rejected: Error: test at <anonymous>:1:17
2. finally() 方法不能改变 Promise 的状态
finally() 方法只是 Promise 状态发生改变后,做一些资源释放、清理的工作,但并不能改变 Promise 对象本身的状态。
例如:
-- -------------------- ---- ------- ----------------------- ----------- -- - ---------------------- ------ ------------------ ---------------- -- ------------- -- - ---------------------- -- ------ -- -------------- -- - ---------------------- -- ------ --
上述代码输出:
finally rejected: Error: reject at <anonymous>:4:20
可以看到,Promise 状态没有从 resolve 改变成 reject,而是执行了 finally() 方法中的代码之后,返回了一个新的 Promise 对象,使得 Promise 状态变成了 reject。
3. finally() 方法可以省略参数
finally() 方法可以省略参数,这种情况下,它只是简单地将 Promise 对象的状态传递给下一个 Promise 实例。
例如:
Promise.reject(new Error('test')) .finally() .then((value) => { console.log('resolved: ', value) }) .catch((error) => { console.log('rejected: ', error) })
上述代码输出:
rejected: Error: test at <anonymous>:1:17
总结
ECMAScript 2018 的 Promise.prototype.finally() 方法可以在 Promise 对象状态改变之后做一些资源释放、清理的工作,并且返回一个新的 Promise 对象。但 finally() 方法本身不会改变 Promise 对象的状态,同时 finally() 方法也可以省略参数。如果我们在 Promise 对象的处理流程中需要做一些资源释放、清理等工作,可以使用 Promise.prototype.finally() 方法,使代码更加简洁和易于阅读。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c7391710032fedd390cfa3