在 JavaScript 中,Promise 对象是一种处理异步操作的方法。承诺提供了解决异步编程问题的优雅方式。但是,当 Promise 处理失败时会发生什么?这时需要使用 catch()
方法或者 then()
方法来处理错误。
then() 和 catch() 方法
then()
方法和 catch()
方法都是 Promise 实例上的方法。then()
方法接受两个回调函数作为参数,第一个回调函数处理 Promise 成功的解析值,第二个回调函数处理 Promise 失败的拒绝原因。如果不需要处理成功的结果,则可以省略第一个参数。如果不需要处理失败的结果,则可以使用 catch() 代替第二个参数。
catch()
方法只接受一个回调函数作为参数,用于处理 Promise 的拒绝原因。如果在 then()
方法中发生异常,则该异常将被传递到下一个 catch()
方法中。
fetch(url) .then(response => response.json()) .then(data => { // 处理数据 }) .catch(error => { console.error('请求错误:', error); });
在上面的示例中,fetch()
方法返回一个 Promise 对象,在 then()
方法中解析服务器响应并将其转换为 JSON 格式。如果任何一步出错,将跳过所有后续的 then()
方法并进入 catch()
方法中。在 catch()
方法中,我们可以记录错误并采取适当的措施。
链式调用
一个 Promise 可以在其上调用多个 then()
方法,这些方法会按顺序执行,并且每个方法都可以返回新的 Promise 对象或值。
-- -------------------- ---- ------- ---------- -------------- -- ---------------- ---------- -- - ------ ------------------ -- ------------ -- - ------ ------------------- -- ------------ -- - ---------------------- ------- ---
在上面的示例中,processData()
和 sendResult()
分别返回一个新的 Promise 对象。如果任何一步出错,则进入 catch()
方法中。
then() 和 catch() 的执行顺序
当 then()
方法和 catch()
方法同时存在时,它们的执行顺序非常重要。在链式调用中,如果 then()
方法返回了一个拒绝状态的 Promise 对象,则立即进入后续的 catch()
方法中。
-- -------------------- ---- ------- ---------- -------------- -- - -- -------------- - ----- --- ----------- ------ ------- --------------------- - ------ ---------------- -- ---------- -- - -- ---- -- ------------ -- - ---------------------- ------- ---
在上面的示例中,如果服务器响应不是成功状态(例如 404 或 500),则抛出异常并进入 catch()
方法中。注意,在该示例中,第一个 then()
方法返回一个拒绝状态的 Promise 对象,因此它会立即进入 catch()
方法中,而不是跳过第二个 then()
方法。
结论
then()
和 catch()
是 Promise 实例上的两个最重要的方法。他们可以用来处理异步操作中的成功和失败,并且可以通过链式调用来组合多个 Promise。当 Promise 处理失败时,使用 catch()
方法或者在 then()
方法中抛出异常来处理错误。在编写 Promise 代码时,请确保考虑到 then()
和 catch()
方法的执行顺序并根据需要组合它们。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/24411