全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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();

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


# util.promisify  # Node  # Node.js常用工具之util模块  # Node.js readline模块与util模块的使用  # Nodejs模块的调用操作实例分析  # nodejs中方法和模块用法示例  # NodeJS学习笔记之Http模块  # NodeJS中Buffer模块详解  # Node.js模块加载详解  # Nodejs学习笔记之NET模块  # NodeJS学习笔记之MongoDB模块  # nodejs基础之常用工具模块util用法分析  # 回调  # 下一  # 就会  # 里也  # 我觉得  # 不需要  # 中有  # 我们可以  # 带来了  # 很简单  # 好吧  # 自定义  # 苦不堪言  # 不支持  # 可以使用  # 不符合  # 就看  # 这套  # 要给  # 便有 


相关文章: 上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何在服务器上三步完成建站并提升流量?  建站之星上传入口如何快速找到?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何高效搭建专业期货交易平台网站?  建站之星安装路径如何正确选择及配置?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  建站之星如何配置系统实现高效建站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  建站之星安装后如何配置SEO及设计样式?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何通过NAT技术实现内网高效建站?  学校建站服务器如何选型才能满足性能需求?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何用狗爹虚拟主机快速搭建网站?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  模具网站制作流程,如何找模具客户?  如何解决VPS建站LNMP环境配置常见问题?  相册网站制作软件,图片上的网址怎么复制?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  C#如何在一个XML文件中查找并替换文本内容  利用JavaScript实现拖拽改变元素大小  佛山企业网站制作公司有哪些,沟通100网上服务官网?  建站之星后台密码如何安全设置与找回?  建站之星代理如何获取技术支持?  建站主机数据库如何配置才能提升网站性能?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  建站主机选购指南:核心配置优化与品牌推荐方案  建站主机选购指南:核心配置与性价比推荐解析  为什么Go需要go mod文件_Go go mod文件作用说明  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  建站上市公司网站建设方案与SEO优化服务定制指南  网站制作公司排行榜,抖音怎样做个人官方网站  宝塔建站无法访问?如何排查配置与端口问题?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  东莞专业制作网站的公司,东莞大学生网的网址是什么?  定制建站如何定义?其核心优势是什么?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  如何通过虚拟主机快速搭建个人网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何在香港免费服务器上快速搭建网站?  英语简历制作免费网站推荐,如何将简历翻译成英文?  建站之星代理商如何保障技术支持与售后服务?  网站制作壁纸教程视频,电脑壁纸网站?  如何通过智能用户系统一键生成高效建站方案?  ,制作一个手机app网站要多少钱?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。