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

 更新时间:2017年06月12日 10:53:27   作者:Meathill  
本篇文章主要介绍了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();

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

相关文章

  • 深入了解 Node的多进程服务实现

    深入了解 Node的多进程服务实现

    本文主要介绍了Node的多进程服务实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 浅谈NodeJs之数据库异常处理

    浅谈NodeJs之数据库异常处理

    这篇文章主要介绍了浅谈NodeJs之数据库异常处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 如何发布一个npm包到 Nexus私有仓库

    如何发布一个npm包到 Nexus私有仓库

    这篇文章主要介绍了如何发布一个npm包到 Nexus私有仓库,通过实例代码介绍了如何添加nexus权限及配置 npm 私库免登录设置的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • NVM切换不同版本node的实现步骤

    NVM切换不同版本node的实现步骤

    nvm是Node.js的版本管理器,可以让我们轻松地在不同的Node.js版本之间进行切换,本文就来介绍一下NVM切换不同版本node的实现步骤,感兴趣的可以了解一下
    2023-12-12
  • node.js中的fs.fsync方法使用说明

    node.js中的fs.fsync方法使用说明

    这篇文章主要介绍了node.js中的fs.fsync方法使用说明,本文介绍了fs.fsync的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 如何利用Node.js做简单的图片爬取

    如何利用Node.js做简单的图片爬取

    这篇文章主要介绍了如何利用Node.js做简单的图片爬取,爬虫的主要目的是收集互联网上公开的一些特定数据,本文介绍用于网络抓取的node.js包,完成一个简单的爬虫案例来爬取网页上图片并下载到本地
    2022-06-06
  • 详解nodejs微信公众号开发——5.素材管理接口

    详解nodejs微信公众号开发——5.素材管理接口

    这篇文章主要介绍了详解nodejs微信公众号开发——5.素材管理接口,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • Node.js中同步和异步编程的区别及使用方法

    Node.js中同步和异步编程的区别及使用方法

    在Node.js中,同步和异步编程是两种不同的处理方式。同步方式会阻塞程序的执行,而异步方式则不会。通过掌握它们的区别和使用方法,可以更好地实现程序的性能优化和功能扩展。同时,需要注意异步编程中的回调地狱问题,使用Promise可以更好地处理异步编程
    2023-05-05
  • Windows下Node.js安装及环境配置方法

    Windows下Node.js安装及环境配置方法

    这篇文章主要为大家介绍一下Node.js安装及环境配置方法,这也是脚本之家小编发现的比较详细的教程了,从安装到配置都很详细,想学习Node.js的朋友可以参考一下
    2017-09-09
  • nodejs dgram模块广播+组播的实现示例

    nodejs dgram模块广播+组播的实现示例

    这篇文章主要介绍了nodejs dgram模块广播+组播的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论