hand
_1_11_143
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 20:06:44
在 JavaScript 的异步编程中,Promise 对象是一个非常重要的概念。它为我们处理异步操作提供了一种优雅且强大的方式,避免了回调地狱的问题。而 finally
方法作为 Promise 对象的一个重要方法,具有一些独特的特点,下面我们就来详细探讨一下。
finally
方法用于在 Promise 结束时,无论其状态是 fulfilled
(已成功)还是 rejected
(已失败),都会执行的操作。其基本语法如下:
promise.finally(onFinally);
其中,promise
是一个 Promise 对象,onFinally
是一个回调函数,当 Promise 状态改变时,该回调函数就会被调用。
下面是一个简单的示例:
function getData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const randomNumber = Math.random();
if (randomNumber > 0.5) {
resolve('Data fetched successfully');
} else {
reject(new Error('Failed to fetch data'));
}
}, 1000);
});
}
getData()
.then(result => console.log(result))
.catch(error => console.error(error))
.finally(() => console.log('This will always be executed'));
在这个示例中,getData
函数返回一个 Promise 对象,该 Promise 对象在 1 秒后根据随机数的值决定是成功还是失败。无论最终状态如何,finally
方法中的回调函数都会被执行。
finally
方法的最大特点就是无论 Promise 的最终状态是 fulfilled
还是 rejected
,它的回调函数都会被执行。这在一些需要进行清理操作的场景中非常有用,比如关闭网络连接、释放资源等。
function openConnection() {
console.log('Connection opened');
return new Promise((resolve, reject) => {
setTimeout(() => {
const randomNumber = Math.random();
if (randomNumber > 0.5) {
resolve('Operation completed successfully');
} else {
reject(new Error('Operation failed'));
}
}, 1000);
});
}
openConnection()
.then(result => console.log(result))
.catch(error => console.error(error))
.finally(() => console.log('Connection closed'));
在这个示例中,无论 openConnection
返回的 Promise 是成功还是失败,finally
方法都会确保连接被关闭。
finally
方法的回调函数不接收 Promise 的状态值(即 resolve
或 reject
的参数)。这意味着在 finally
方法中无法直接获取 Promise 的结果。
const promise = new Promise((resolve, reject) => {
resolve('Success');
});
promise.finally(() => {
// 这里无法获取 Promise 的结果
console.log('Finally block executed');
})
.then(result => console.log(result));
finally
方法返回一个新的 Promise,该 Promise 的状态与原 Promise 相同。也就是说,如果原 Promise 是 fulfilled
状态,finally
方法返回的 Promise 也是 fulfilled
状态;如果原 Promise 是 rejected
状态,finally
方法返回的 Promise 也是 rejected
状态。
const fulfilledPromise = Promise.resolve('Success');
const rejectedPromise = Promise.reject(new Error('Failure'));
fulfilledPromise.finally(() => console.log('Finally block for fulfilled promise'))
.then(result => console.log(result)); // 输出: Success
rejectedPromise.finally(() => console.log('Finally block for rejected promise'))
.catch(error => console.error(error)); // 输出: Error: Failure
finally
方法可以与 then
和 catch
方法一起进行链式调用,使代码更加简洁和易读。
function asyncOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Async operation completed');
}, 1000);
});
}
asyncOperation()
.then(result => {
console.log(result);
return result.toUpperCase();
})
.then(upperCaseResult => console.log(upperCaseResult))
.catch(error => console.error(error))
.finally(() => console.log('Chain ended'));
特点 | 描述 |
---|---|
无论状态如何都会执行 | 不管 Promise 最终是 fulfilled 还是 rejected ,finally 方法的回调函数都会执行 |
不接收状态值 | 回调函数不接收 Promise 的状态值 |
传递 Promise 状态 | finally 方法返回的 Promise 状态与原 Promise 相同 |
可链式调用 | 可以与 then 和 catch 方法一起进行链式调用 |
通过了解和掌握 finally
方法的这些特点,我们可以更加灵活地处理异步操作,编写出更加健壮和可靠的 JavaScript 代码。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~