在前端开发中,很多时候都需要进行异步编程,而 Promise 是一种非常流行的解决方案。ECMAScript 2017 引入了 Promise.prototype.finally() 方法,这个方法在 promise 执行结束时无论成功还是失败,可以让开发者在代码层面实现一些最终操作。
Promise.prototype.finally() 的作用
Promise.prototype.finally() 方法接受一个函数作为参数,在 Promise 状态为 fulfilled 或 rejected 时都会执行这个函数,而且无论 Promise 状态如何,finally() 方法的返回值都会是一个新的 Promise 对象。
这个新 Promise 对象的状态根据其他 Promise 对象的状态而定:
- 如果前面的 Promise 对象为 fulfilled,则 finally() 方法返回的 Promise 对象的状态也为 fulfilled。
- 如果前面的 Promise 对象为 rejected,则 finally() 方法返回的 Promise 对象的状态也为 rejected。
- 如果 finally() 方法抛出异常或返回一个 rejected 状态的 Promise 对象,则新 Promise 对象的状态也为 rejected。
通过这个方法,我们可以实现一些不管 Promise 执行结果如何都要执行的最终操作,比如清除一些资源、关闭一些持久连接等。
Promise.prototype.finally() 的用法示例
我们来看一个使用 Promise.prototype.finally() 的实际例子:
// www.javascriptcn.com code example
fetch('url')
.then(response => {
// 处理响应
})
.catch(error => {
// 处理错误
})
.finally(() => {
// 始终执行的操作
console.log('fetch 结束');
});在这个例子中,我们使用 fetch() 方法获取数据。如果 fetch() 成功获取了数据,我们会在 then() 方法中进行处理;如果获取失败,我们会在 catch() 方法中处理错误。
不管 fetch() 接口的执行结果如何,我们都需要在结束时执行一些清理操作,例如记录日志或关闭连接等,那么这个时候就可以使用 finally() 方法来实现。
再来看一个例子,这个例子演示如何使用 Promise.prototype.finally() 来关闭 WebSocket 连接:
// www.javascriptcn.com code example
const ws = new WebSocket('wss://echo.websocket.org');
ws.onopen = function(event) {
console.log('WebSocket 连接已经建立');
};
ws.onmessage = function(event) {
console.log('接收到的数据:', event.data);
};
ws.onclose = function(event) {
console.log('WebSocket 连接已经关闭');
};
ws.onerror = function(event) {
console.log('WebSocket 出现错误');
};
ws.send('Hello WebSocket!');
ws.close();当执行 ws.close() 方法时,WebSocket 连接就会被关闭,但是由于 WebSocket 的关闭是异步操作,因此我们需要在 WebSocket 连接关闭后才能进行一些清理工作。那么这个时候,我们可以使用 Promise.prototype.finally() 方法来实现:
// www.javascriptcn.com code example
const ws = new WebSocket('wss://echo.websocket.org');
ws.onopen = function(event) {
console.log('WebSocket 连接已经建立');
};
ws.onmessage = function(event) {
console.log('接收到的数据:', event.data);
};
ws.onclose = function(event) {
console.log('WebSocket 连接已经关闭');
};
ws.onerror = function(event) {
console.log('WebSocket 出现错误');
};
ws.send('Hello WebSocket!');
new Promise(resolve => {
ws.onclose = function(event) {
console.log('WebSocket 连接已经关闭');
resolve();
};
}).finally(() => {
console.log('WebSocket 连接关闭,开始执行清理工作');
// TODO:这里可以进行一些清理工作
});在这个例子中,我们创建了一个 Promise 对象,使用 resolve() 方法来设置 Promise 对象的状态为 fulfilled。在 Promise 对象的 finally() 方法中,我们可以进行一些清理工作。
当 WebSocket 连接关闭后,onclose 事件会被触发,然后我们通过 resolve() 方法来将 Promise 对象的状态设置为 fulfilled。这个时候,Promise 相关的执行完成函数就会被执行,从而可以进行一些清理工作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d0069fe46428fe9ec85c0f