在以前的异步操作中,我们通常使用回调函数来处理异步操作。但是回调嵌套会让代码变得难以维护和阅读。为了解决回调地狱,Promise 出现了。在 Promise 出现后,我们可以通过链式调用来简化异步操作并让代码更加优雅。但是,Promise 的使用过程中也存在问题。比如说需要重复的手动包装函数,比如说没有办法很好地处理一些异步操作的返回值等等。
这时,我们可以使用 npm 包 @hal313/promiseifyish 来更好地使用 Promise。
@hal313/promiseifyish 是什么?
@hal313/promiseifyish 是一个 npm 包,通过它我们可以轻松地将一个普通的函数包装成一个可以返回 Promise 的函数。它的作用不仅仅是将一个函数返回值转换成 Promise,还可以自定义错误处理、回调函数里的参数都会通过 Promise 传递出去。
接下来我们详细介绍如何使用 @hal313/promiseifyish。
安装 @hal313/promiseifyish
你可以通过 npm 安装 @hal313/promiseifyish:
npm install @hal313/promiseifyish
使用 @hal313/promiseifyish
下面我们将以一个示例代码说明如何使用 @hal313/promiseifyish。
假设我们有一个函数如下:
function printTime(time) { setTimeout(function() { console.log(new Date(time).toUTCString()); }, 1000); }
这个函数需要等待 1 秒才输出时间。我们想将这个函数包装成 Promise 版本的,可以这样使用 @hal313/promiseifyish:
-- -------------------- ---- ------- ----- ------------- - --------------------------------- ----- ---------------- - ------------------------- --------------------------- - ----- -------- -- - ----------------- ------- ---------------- -- ---------- -- - ------------------- ---
上述代码中,打印时间的函数被包装成 Promise 的形式,然后我们就可以通过 Promise 的方式调用该函数,使用 then 和 catch 处理回调函数里的参数。
@hal313/promiseifyish 的更多用法
除了将函数包装成 Promise 之外,@hal313/promiseifyish 还有很多其它用法,下面我们一一介绍。
包装函数时传入 Promise 构造函数
默认情况下,@hal313/promiseifyish 使用 Promise.resolve() 来包装 Promise。但是你可能需要使用 Promise 的别的构造函数,那么可以通过传入 Promise 构造函数来实现:
-- -------------------- ---- ------- ----- ------------- - --------------------------------- ----- --------------- - -------------------- ----- ---------------- - ------------------------ ----------------- --------------------------- - ----- -------- -- - ----------------- ------- ---------------- -- ---------- -- - ------------------- ---
上述代码中,我们传入了 bluebirdPromise,即将 printTime 包装成 Bluebird Promise 的形式。
自定义错误处理
我们可以使用 @hal313/promiseifyish 自定义错误处理逻辑,使用方法如下:
-- -------------------- ---- ------- ----- ------------- - --------------------------------- ----- ------ - -------------------- -------- --------------- - --------------------- - -- ----- - ----------- - ------ --------------------------- - --------------- -------------------------- -- ------ - ----- ---------------- - ------------------------ - ------------ ----- -- --- --- -------------------------- - ---- - --- --- --------------------------- - ----- -------- -- - ----------------- ------- ---------------- -- ---------- -- - ------------------- ---
上述代码中,我们定义了一个错误处理函数 errorFilter,如果 printTime 返回 ERRORS.TIME_IS_IN_THE_PAST,那么就会将这个错误过滤掉,否则会将它传递出去。
传入前置参数
如果我们的函数有前置参数,我们想要将这些参数传入,可以这样使用 @hal313/promiseifyish:
-- -------------------- ---- ------- ----- ------------- - --------------------------------- -------- -------------- --------- - --------------------- - --------------- ----------- -- ------ - ----- --------------- - ----------------------- ----- ----------- ----------------- --------- -- - ----------------- -- ---------- -- - ------------------- ---
上述代码中,我们将 'world' 作为 sayHello 的第一个参数传入,这样我们就可以直接使用 Promise 的形式调用 sayHello,而不需要手动传入 'world'。
总结
在 Promise 的使用过程中,我们遇到了一些问题,@hal313/promiseifyish 正是为了解决这些问题而出现的。使用 @hal313/promiseifyish 可以轻松地将普通函数转换为 Promise 的形式,而且可以自定义错误处理、前置参数等,从而使 Promise 的使用更加灵活和优雅。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600672e30520b171f02e1d6a