承诺:then() vs catch()

在 JavaScript 中,Promise 对象是一种处理异步操作的方法。承诺提供了解决异步编程问题的优雅方式。但是,当 Promise 处理失败时会发生什么?这时需要使用 catch() 方法或者 then() 方法来处理错误。

then() 和 catch() 方法

then() 方法和 catch() 方法都是 Promise 实例上的方法。then() 方法接受两个回调函数作为参数,第一个回调函数处理 Promise 成功的解析值,第二个回调函数处理 Promise 失败的拒绝原因。如果不需要处理成功的结果,则可以省略第一个参数。如果不需要处理失败的结果,则可以使用 catch() 代替第二个参数。

catch() 方法只接受一个回调函数作为参数,用于处理 Promise 的拒绝原因。如果在 then() 方法中发生异常,则该异常将被传递到下一个 catch() 方法中。

----------
  -------------- -- ----------------
  ---------- -- -
    -- ----
  --
  ------------ -- -
    ---------------------- -------
  ---

在上面的示例中,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