在 JavaScript 中, Promise 是一种实现异步编程的方法。Promise 可以被认为是一个容器,它代表着一个异步操作的最终完成状态(成功或失败)以及所产生的值。Promise 有三个状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。
当 Promise 进入 fulfilled 或 rejected 状态时,它们的 then 方法被调用。但是如果 Promise 进入 rejected 状态,而没有被任何一个 then 方法处理,则 Promise 会抛出一个错误。为了避免这种情况,我们需要使用 catch 方法来捕获 Promise 内部的错误。
catch 方法
Promise 的 catch 方法用于捕获 Promise 内部的错误。它接收一个函数作为参数,该函数会在 Promise 进入 rejected 状态时被调用。如果 Promise 进入 fulfilled 状态,catch 方法不会被调用。
fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error));
在上面的例子中,当 Promise 进入 rejected 状态时,catch 方法会输出错误信息。
finally 方法
Promise 的 finally 方法会在 Promise 执行结束后无论其状态如何都会被执行。它接收一个函数作为参数,在 Promise 执行结束时被调用,并且不接受任何参数。
fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)) .finally(() => console.log('Promise 已执行结束'));
在上面的例子中,不管 Promise 进入 fulfilled 或 rejected 状态,finally 方法都会被执行。
catch 和 finally 的顺序
catch 和 finally 方法都是在 Promise 执行结束后被调用的,它们的执行顺序是先调用 catch 方法,再调用 finally 方法。如果 catch 方法中又抛出了一个错误,则 finally 方法也会被中断。
fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .then(data => console.log(data)) .catch(error => { console.error(error); throw new Error('another error'); }) .finally(() => console.log('Promise 已执行结束'));
在上面的例子中,由于 catch 方法中抛出了一个新的错误,则 finally 方法不会被执行。
指导意义
在使用 Promise 进行异步编程时,我们需要根据业务需求适当地使用 catch 和 finally 方法来处理 Promise 执行过程中可能出现的错误情况。使用 catch 方法可以避免出现未处理的错误,而使用 finally 方法可以在 Promise 执行结束后进行一些后续操作(例如清理资源等)。
在使用 catch 和 finally 方法时,要注意它们的执行顺序以及在 catch 方法中可能抛出的新错误对 finally 方法的影响,保证代码的正确性和健壮性。
结论
本文详细讲解了 Promise 中的 catch 和 finally 方法,并通过示例代码演示了它们的用法及执行顺序。使用 catch 和 finally 方法可以提高代码的健壮性和可读性,更好地处理 Promise 执行过程中可能出现的错误情况。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66efea0a6fbf960197314c49