在现代 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