承诺:then() vs catch()

阅读时长 4 分钟读完

在 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

纠错
反馈