当前位置:首页 > 日记 > 正文

Node.js 8 中的 util.promisify的详解

Node.js 8 中的 util.promisify的详解

Node.js 8 于上个月月底正式发布,带来了 很多新特性 。其中比较值得注意的,便有 util.promisify() 这个方法。

util.promisify()

虽然 Promise 已经普及,但是 Node.js 里仍然有大量的依赖回调的异步函数,如果我们每个函数都封装一次,也是齁麻烦齁麻烦的,比齁还麻烦。

所以 Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法,接下来,想继续用队列,还是 await 就看需要了。

我们看下范例:

const util = require('util');const fs = require('fs');const stat = util.promisify(fs.stat);stat('.') .then((stats) => {  // Do something with `stats` }) .catch((error) => {  // Handle the error. });

怎么样,很简单吧?按照文档中的说法,只要符合 Node.js 的回调风格,所有函数都可以这样转换。也就是说,满足下面两个条件即可。

  1. 最后一个参数是函数
  2. 回调函数的参数为 (err, result),前面是可能的错误,后面是正常的结果

结合 Await/Async 使用

同样是上面的例子,如果想要结合 Await/Async,可以这样使用:

const util = require('util');const fs = require('fs');const stat = util.promisify(fs.stat);async function readStats(dir) { try {  let stats = await stat(dir);  // Do something with `stats` } catch (err) { // Handle the error.  console.log(err); }}readStats('.');

自定义 Promise 化处理函数

那如果函数不符合这个风格,还能用 util.promisify() 么?答案也是肯定的。我们只要给函数增加一个属性,util.promisify.custom ,指定一个函数作为 Promise 化处理函数,即可。请看下面的代码:

const util = require('util');function doSomething(foo, callback) { // ...}doSomething[util.promisify.custom] = function(foo) { return getPromiseSomehow();};const promisified = util.promisify(doSomething);console.log(promisified === doSomething[util.promisify.custom]);// prints 'true'

如此一来,任何时候我们对目标函数 doSomething 进行 Promise 化处理,都会得到之前定义的函数。运行它,就会按照我们设计的特定逻辑返回 Promise 实例。

我们就可以升级以前所有的异步回调函数了。

Promise 介绍

因为种种历史原因,JS 当中有大量异步函数。这些异步函数,大多要依赖回调进行处理(这里我觉得把事件侦听算作回调也是合理的),但是回调嵌套层次一多,就会形成所谓的“回调陷阱”,让开发者苦不堪言。

为了解决这个问题,开发社区经过摸索,总结出来一套名为 Promise/A+ 的解决方案。大体上来说,这套方案通过使用 “Promise 回调实例”包裹原先的回调函数,可以将原先复杂的嵌套展开、铺平,从而降低开发和维护的难度和成本。

new Promise( (resolve, reject) => { // 构建一个 Promise 实例 someAsyncFunction( (err, result) => { // 调用原来的异步函数  if (err) { // 发生错误,进入错误处理模式   return reject(err);  }  resolve(result); // 一切正常,进入队列的下一环节 });}) .then( result => { // 下一环节  return doSomething(result); }) .then( result2 => { // 又下一环节  return doSomething2(result2); }) ... // 各种中间环节 .catch( err => { // 错误处理  console.log(err); });

ES2015(ES6)里包含了 Promise 标准,如今已经在大部分运行时里实装,我们可以放心大胆的使用它。而且,由于 Promise 不需要新的语法元素,所以即使在不支持原生 Promise 的环境里也可以使用类库,比如 Q 或者 Bluebird ,甚至 jQuery 。

在小程序里也有效哟。

ES2017 增加了 Await/Async 语法,但请注意, Await 后面必须跟 Promise 实例才能实现异步。所以,大家还是把 Promise 的概念学好吧!

function resolveAfter2Seconds(x) { return new Promise(resolve => {  setTimeout(() => {   resolve(x);  }, 2000); });}async function f1() { var x = await resolveAfter2Seconds(10); console.log(x); // 10}f1();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

setTimeout函数的神奇使用

setTimeout函数的神奇使用

函数,神奇,电脑软件,setTimeout,【写在前面的胡言乱语】自从大三开始实习之后,就没有写博客了,虽然学了很多东西,但是如果没有进行总结和分享,学的东西就很容易忘记,而且不进行分享,就不会手动去敲代码,这样对知识的理解就不够透彻。现在毕业半年…

Node学习记录之cluster模块

Node学习记录之cluster模块

模块,学习,电脑软件,Node,cluster,在如今机器的CPU都是多核的背景下,Node的单线程设计已经没法更充分的"压榨"机器性能了。所以从v0.8开始,Node新增了一个内置模块——“cluster”,故名思议,它可以通过一个父进程管理一坨子进程的方式来实现…

自定义事件解决重复请求BUG的问题

自定义事件解决重复请求BUG的问题

请求,自定义事件,电脑软件,BUG,现在,组件化开发还是比较流行的,毕竟其优点相当突出。最近在开发一个组件的时候,遇到了一个很有意思的BUG。。。BUG的背景最近在开发一个组件,好不容易开发好了转测试。然后,测试给我提了一个这样的bug,orz...因为…

微信小程序异步处理详解

微信小程序异步处理详解

异步处理,详解,程序,电脑软件,微信小,本文实例为大家分享了微信小程序异步处理的具体方法,供大家参考,具体内容如下直接看问题:然后看打印的结果:根据上面两图可以看出,代码上先执行的网络请求,再执行打印的变量,但是从下面打印的结果来看,先出结果…

解决ASP.NET Core Mvc文件上传限制

解决ASP.NET Core Mvc文件上传限制

文件上传,实例,电脑软件,NET,ASP,一、简介在ASP.NET Core MVC中,文件上传的最大上传文件默认为20MB,如果我们想上传一些比较大的文件,就不知道怎么去设置了,没有了Web.Config我们应该如何下手呢?二、设置上传文件大小1.应用程序级别设置我们需…

JS之if语句对接事件动作逻辑 | 详

JS之if语句对接事件动作逻辑 | 详

语句,事件,详解,逻辑,动作,if 函数的实现步骤:function +名字()指定id , 指定开关(display: none or block)if + else 构成逻辑 控制开关决定在哪里安置一个灯泡, 指定一个id给某个标签把开关用电线连着灯泡, 安装开关#+id名称{ 属性1= 赋值…

浅谈jquery中ajax跨域提交的时候会

浅谈jquery中ajax跨域提交的时候会

提交,请求,跨域,会有,浅谈,我们平时在同域中请求页面什么的时候不会有这种情况,这种情况大多发生在移动端的跨域请求中发生的。解决方法就是在服务端中加一层过滤HTTP请求的类型,把OPTION等不用的类型过滤掉。就是当请求为非HTTP中的 GET 和 …

JS库 Highlightjs 添加代码行号的

JS库 Highlightjs 添加代码行号的

行号,代码,电脑软件,JS,Highlightjs,Highlightjs是一款优秀的代码高亮Js组件,可以很方便地对各种语言编写的代码添加语法高亮样式。然而,Highlightjs默认是不包括显示代码行号(Line Number)这一特性的,不过可以通过简单的JS代码和CSS样式表实现…

painter怎么使用钢笔画笔绘制图形?

painter怎么使用钢笔画笔绘制图形?

绘制图形,电脑软件,painter,Painter绘制图形很简单,是一款很常用的绘图软件,今天我们就来看看painter中钢笔画笔的使用方法,请看下文详细介绍软件名称:Corel Painter(绘画软件) 2018 官方正式版(附注册机) 在线安装包 64位软件大小:994KB更新时…

excel表格斜杠绘制教程

excel表格斜杠绘制教程

绘制,教程,斜杠,表格,电脑软件,  Excel表格中如何绘制斜杠呢?下面是由小编分享的excel表格斜杠绘制教程,以供大家阅读和学习。excel表格斜杠绘制教程:  绘制斜杠步骤1:有时候,做表格需要给第一个格加斜杠,如下,绘制斜杠步骤2:选中要加斜杠的单…

Bootstrap栅格系统使用方法及页面

Bootstrap栅格系统使用方法及页面

变形,栅格系统,调整,解决方法,使用方法,如果你以前使用过Bootstrap2或者了解过响应式技术,那么肯定对Bootstrap栅格系统并不陌生,由于栅格系统的引入,使得Bootstrap的跨设备布局显示变得可能。什么是栅格系统栅格系统是指,将页面布局划分为等宽…

手机wps的ppt背景怎么编辑

手机wps的ppt背景怎么编辑

模板,方法,幻灯片,背景,编辑,  wps幻灯片的制作,怎么用手机去制作ppt呢?其实手机添加幻灯片模板和制作方法都很简单,关键是多学,下面给大家分享使用手机wps编辑幻灯片模板的方法,欢迎大家来到学习。手机wps添加幻灯片模板的方法wps添加幻灯片…