npm 包 cancellation-wrapper 使用教程

阅读时长 8 分钟读完

在编写前端程序时,很多时候我们需要与服务端进行交互。一些耗时的请求可能会导致用户体验变差,而取消这些请求又是一件比较困难的事情。这时候,我们就需要 cancellation-wrapper 这个 npm 包了。

什么是 cancellation-wrapper?

cancellation-wrapper 是一个为 axios 封装的 npm 包,它的作用是让我们能够取消已经发起的异步请求。使用该包能够让我们更加灵活地控制请求,提升用户体验。

如何使用 cancellation-wrapper?

安装

在项目目录中,执行以下命令进行安装:

引入和初始化

在需要使用 cancellation-wrapper 的地方引入包,并初始化:

发起请求

使用 cancellationWrapper 发起请求:

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

取消请求

在需要取消请求的地方调用 cancel() 方法即可:

示例代码

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

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

--- -------

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

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

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

深度解析

什么是 CancelToken

在我们发起请求时,我们通过传入 CancelToken 参数来创建一个 Token。而在取消请求时,我们同样需要使用这个 Token。下面是 CancelToken 的定义:

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

由此,我们可以看到,一个 CancelToken 对象包含了三个方法,其中两个是静态方法,一个是实例方法。通过 CancelToken,我们可以方便地生成一个 Token。

什么是 CancelTokenSource

CancelTokenSource 在上面的定义中用到了,它同样是一个可以生成 Token 的对象。下面是它的定义:

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

CancelTokenSource 包含了两个属性,一个是用于取消请求的方法 cancel(),另一个是用于取消的 Token 对象。通过 CancelTokenSource,我们可以拿到一个可以用于取消请求的 Token。

wrapAxios

在注入 closure 的时候,cancellation-wrapper 选择了将 cancelToken 和 axios 实例的 closure 一块保存到 closure 数组中。其中,cancelToken 部分主要是用来支持以取消 request 的功能,而 axios 实例则是为了方便 request 的调用。

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

  -- ------

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

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

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

在使用 cancellation-wrapper 的时候,我们可以通过 cancel() 方法来取消请求。同时,在请求被取消时,我们也把 cancelToken 的 request 调用取消掉。由此,我们保证了请求被成功取消。

总结

cancellation-wrapper 可以让我们更加灵活地控制请求,提升用户体验。在使用 cancellation-wrapper 时,我们需要进行初始化、发起请求、取消请求等步骤。同时,在深度解析时,我们也介绍了 CancelToken 和 CancelTokenSource 对象,以及 wrapAxios 的实现原理。为了保证请求的正常运行,我们需要检查 cancelToken 和 axios 的 cancellation 是否被触发。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6006735c890c4f7277583fca

纠错
反馈