JavaScript Promise 是一种异步编程解决方案,它可以让我们更加方便地处理异步操作中的成功和失败两种情况。在 Promise 中,then 和 catch 是最常用的两种方法,它们可以让我们在异步操作完成后处理相应的结果。在本文中,我们将详细讲解 then 和 catch 的链式调用用法。
then 方法
在 Promise 中,then 方法用于注册成功时的回调函数,它的语法如下:
promiseObj.then(onResolved, onRejected)
其中,onResolved 表示成功时的回调函数,onRejected 表示失败时的回调函数。具体来说,当 promiseObj 状态值变为成功时,就会调用 onResolved 函数;当状态值变为失败时,则会调用 onRejected 函数。
then 方法的返回值是一个新的 Promise 对象,因此我们可以通过链式调用的方式继续注册 then 方法来处理回调函数返回的结果。例如,假设我们有一个异步操作用于获取用户信息:
-- -------------------- ---- ------- -------- ------------------- - ------ --- ------------------------- ------- - -- ------ --------------------- - -- ------- --- -- - ------------ -- ----- --------- - ---- - ---------- ----------- --- --------- - -- ------ --- -
我们可以通过 then 方法来处理成功和失败两种情况:
-- -------------------- ---- ------- -------------- -------------------- - ----------------------- ------ ---------- -- ----------- ---- -- -- -------------------- - ------------------- - - ------ -- ---------------------- - ----------------------------- ---
上面的代码中,我们首先调用 getUserInfo 方法获取用户信息。当用户信息获取成功后,会通过 then 方法中的回调函数进行处理。这里,我们将用户名称作为返回值传递给下一个 then 方法,从而实现链式调用。最后,如果有任何一个 then 方法中出现异常,都会通过 catch 方法来进行处理。
值得注意的是,then 方法中的回调函数不仅可以返回普通值,还可以返回一个 Promise 对象。此时,下一个 then 方法会等待这个 Promise 对象的状态变化后再进行处理。例如:
-- -------------------- ---- ------- ----- -------- ----------- - --- -------- - ----- ------------------------------------------------------ --- ---- - ----- ---------------- ------ ----- - ----------- -------------------- - ----------------------- ------ --- ------------------------- ------- - --------------------- - -------------- ---- ---------- -- ------ --- -- ----------------------- - --------------------- -- ---------------------- - ----------------------------- ---
在上面的例子中,我们首先通过 fetch 方法来获取用户信息。当数据获取成功后,我们将用户名打印出来,并返回一个 Promise 对象。在该 Promise 的回调函数中,我们模拟等待 1 秒钟后返回一个成功的消息。最后,我们在第二个 then 方法中打印出这个消息。
catch 方法
如果 Promise 的状态值变为失败,我们可以通过 catch 方法来处理相应的错误。catch 方法用于注册失败时的回调函数,其语法如下:
promiseObj.catch(onRejected)
其中,onRejected 表示失败时的回调函数。如果在 Promise 中出现异常,或者 Promise 被 reject 时,就会调用 onRejected 函数。
和 then 方法一样,catch 方法的返回值也是一个新的 Promise 对象,因此我们也可以通过链式调用的方式来处理多个 catch 方法。例如:
-- -------------------- ---- ------- -------------- -------------------- - ----------------------- -- ---------------------- - ----------------------------- ------ -------- ------ -- -------------------- - ------------------- - - ------ -- ---------------------- - --------------------- ---
在上面的例子中,我们首先调用 getUserInfo 方法获取用户信息。当 userId 不为 1 时,Promise 就会被 reject。此时,我们可以通过 catch 方法来捕获异常,并返回 'Unknown user'。之后,我们再次使用 then 方法来打印消息,再通过一个 catch 方法来处理潜在的异常情况。
异常处理
如果在 then 方法中出现错误,就会根据注册的回调函数来处理相应的异常。例如:
-- -------------------- ---- ------- -------------- -------------------- - ----------------------- ----- --- ------------ -- ------- -- ---------------------- - --------------------- ------ -------- ------ -- -------------------- - ------------------- - - ------ -- ---------------------- - --------------------- ---
在上面的例子中,我们在 then 方法中手动抛出一个异常。此时,Promise 的状态值变为失败,就会调用 catch 方法中的回调函数。在该回调函数中,我们打印出异常信息,并返回 'Unknown user'。之后,我们再次使用 then 方法来打印消息,再通过一个 catch 方法来处理潜在的异常情况。
结论
通过 then 和 catch 方法的链式调用,我们可以更加方便地处理异步操作的回调函数。如果需要在异步操作中处理多个回调函数,我们可以通过链式调用的方式来继续注册 then 方法。如果在这个过程中出现了异常,就可以通过 catch 方法来处理相应的错误。请务必注意基础语法和异常处理,让异步编程变得更加轻松和高效。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6719e1509b4aadf9e00674e3