Fetch 设置请求超时

在现代的前端开发中,网络请求的超时处理是一个非常重要的功能。它确保了当请求耗时过长时,应用能够及时做出响应,而不是一直等待服务器的响应。虽然 Fetch API 本身没有内置的超时机制,但可以通过多种方式实现这一功能。

使用 Promise.race 实现超时控制

Promise.race 是一个非常有用的函数,它可以接收多个 Promise,并返回一个最先完成的 Promise 的结果。利用这一点,我们可以创建一个带有超时机制的请求。

示例代码

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

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

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

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

在这个例子中,我们首先创建了一个 AbortController,用于在请求超时时取消请求。然后,我们使用 setTimeout 创建了一个超时的 Promise,如果请求超过设定的时间(这里是 8000 毫秒),则调用 controller.abort() 来取消请求,并通过 reject 抛出一个错误。最后,我们使用 Promise.race 来比较请求的 Promise 和超时的 Promise,谁先完成就执行哪个。

使用 async/await 实现超时控制

除了使用 Promise.race,我们还可以利用 async/await 来实现更直观的代码结构。这种方式需要将 Promise 转换成 async 函数。

示例代码

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

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

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

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

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

在这个例子中,我们将 fetchWithTimeout 函数定义为一个 async 函数。这样可以更方便地使用 await 关键字来等待 Promise 的完成。同时,我们通过 try/catch 结构来捕获并处理可能发生的错误,包括超时错误和网络请求错误。

使用自定义的超时逻辑

除了上述两种方法,我们也可以完全自己实现超时逻辑。例如,我们可以在发送请求后立即启动一个定时器,如果请求在一定时间内未完成,则认为请求超时,并执行相应的操作。

示例代码

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

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

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

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

在这个例子中,我们在发送请求之前启动了一个定时器,如果请求在指定的时间内未完成,我们就认为请求超时,并通过 controller.abort() 来取消请求。同时,在请求成功或失败后,我们都会清除定时器,以避免不必要的副作用。

以上就是几种常见的 Fetch API 请求超时设置的方法。每种方法都有其优缺点,可以根据实际需求选择最适合的方式。

上一篇: Fetch 表单提交
纠错
反馈