NPM 包 Promisie 使用教程

阅读时长 9 分钟读完

在现代 JavaScript 开发中,Promise 技术已经成为了不可或缺的一部分。Promisie 是一个专门用于 Promise 相关运算的 NPM 包,它以一整套 Promise 工具为基础,为开发者提供了更好的 Promise 编程体验。在本文中,我们将详细介绍 Promisie 包的使用方法。

Promisie 基础

Promisie 是一种 Promise 工具库,其中主要包括以下几个方法:

  • promisify :将回调函数转换为 Promise 函数。
  • promisifyAll :将对象的所有函数都转换为 Promise 函数。这在异步编程中非常方便。
  • resolveWith :只有当 Promise 状态为 "pending" 时,才会将其解决为指定值。
  • rejectWith :只有当 Promise 状态为 "pending" 时,才会将其拒绝为指定原因。
  • timeout :在指定的时间后自动拒绝 Promise。
  • map :将写入异步操作的数组映射到 Promise 中。并行处理异步操作。
  • each :每次处理一个项目异步操作。

下面我们会一一看到这些方法的使用方法。

Promisie 的安装

首先,让我们来安装 Promisie 包。在终端中使用以下命令:

这将在你的项目中安装 Promisie 包。

promisify 方法

promisify 方法将回调函数转换为 Promise 函数。让我们看一个例子来理解其使用方法。

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

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

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

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

------------------------- ----------
  --------- -- -----------------
  ---------- -- ------------------ -- ------- --------
展开代码

上面代码的第一个函数是一个异步函数,它只能接受回调函数作为参数。我们先使用了 promisify 方法将其转换为 Promise 函数。然后我们调用这个函数,发现它的返回值是一个 Promise 对象。这意味着我们可以使用 then 和 catch 方法来处理返回结果或者抛出错误。

promisifyAll 方法

promisifyAll 方法可以将所有函数转换为 Promise 函数。具体做法是通过 Map 函数从一个对象中将回调函数转换到 Promisify 函数中。我们来看一个例子:

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

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

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

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

-------------------------------
  --------- -- -----------------
  ---------- -- ------------------ -- ------- --------
展开代码

在上面的例子中,我们首先定义了一个对象 asyncFunctionsObj,其中有两个函数。然后,我们使用 promisifyAll 方法将两个函数均转换为 Promise 函数。最后,我们使用新的 Promise 函数对象调用异步函数,其中返回值是一个 Promise 对象。

resolveWith 方法

resolveWith 方法只有在 Promise 状态为 "pending" 时才会将其解决为指定值。它可以通过这种方式来在 Promise 以外的代码中直接解决 Promise,并传递指定值。我们来看一个例子:

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

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

--------------- -
  ----------------------------------- --------- ------
    --------- -- ------------------ -- -----
-- ------
展开代码

在上面的例子中,我们创建了一个 Promise 来模拟某些异步工作。等待 2 秒钟后,它才完成并解决为 'Done!'。一秒钟后,我们调用 Promisie 的 resolveWith 方法,将已解决的 Promise 和解决时的值传递给它。在这个例子里,我们把 Promise 从外部直接解决为 'Resolved With',但由于 Promise 的状态已经被解决为 'Done!',所以不会改变。

rejectWith 方法

rejectWith 方法只有在 Promise 状态为 "pending" 时才会将其拒绝为指定原因。它可以让我们在 Promise 外部直接拒绝一个 Promise,并传递指定的拒绝原因。我们来看一个例子:

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

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

--------------- -
  ---------------------------------- --------- ------
    ---------- -- ------------------ -- ----- --------
-- ------
展开代码

在上面的例子中,我们创建了一个 Promise 来模拟某些异步工作。等待 2 秒钟后,它才拒绝为 'Error Occurred'。一秒钟后,我们调用 Promisie 的 rejectWith 方法,将可解决的 Promise 和拒绝原因传递给它。在这个例子里,我们把 Promise 从外部直接拒绝为 'Rejected With',但由于 Promise 已经从内部拒绝为 'Error Occurred',所以不会改变。

timeout 方法

timeout 方法在指定的时间后自动拒绝 Promise。如果在指定的时间内未解决 Promise,它将拒绝此 Promise。这个方法非常适用于在一定时间内完成特定的任务。

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

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

------------------------------- ----- -------- -----------
  --------- -- -----------------
  ---------- -- ------------------
展开代码

在上面的例子中,我们创建了一个 Promise 来模拟某些异步工作。等待 5 秒钟后,它才解决为 'Done!'。但是,在 promisie.timeout 函数中,我们将等待时间设置为 2 秒,并将错误消息设置为 'Timeout Occurred!'。结果,在 2 秒的等待时间之后,Promisie 自动拒绝上面的 Promise。

map 方法和 each 方法

map 方法和 each 方法允许我们将写入异步操作的数组映射到 Promise 中。对于一个含有大量项的指向相似异步操作的数组,或者是对于一个含有其他异步依赖项的数组,这个工具会非常有用。下面是一个例子:

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

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

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

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

----------------- ------ -- ------------------------------------
  --------- -- ----------------- -- --------- ------------------- ----------
  ---------- -- ------------------
展开代码

在上面的例子中,我们首先定义了一个异步函数 asyncFunc。对于偶数值,它返回异步操作,否则返回一个错误。然后我们定义了一个包含多项的数组。我们需要异步处理每个数组项,所以我们在 promisify 中嵌套异步函数 asyncFunc。然后我们使用每个项的 Promise 将其作为 promisie.each 或 promisie.map 的参数。每当 promisie.each 或 promisie.map 函数执行完该异步函数时,就发出一个新的 Promise。在上面的例子中,我们第一次使用 promisie.each 函数执行操作,第二次使用 promisie.map 函数执行操作。最后,我们将所有结果都作为结果打印出来。

结论

Promisie 包是一个权威的 NPM 包,它提供了一整套 Promise 工具,大大简化了 JavaScript 的异步编程体验。在本文中,我们学习了 promisify、promisifyAll、resolveWith、rejectWith、timeout、map 和 each 等方法的使用方法。这个例子和介绍应该可以帮助你更好地理解 Promisie 的使用方法。

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

纠错
反馈

纠错反馈