前言

Promise:把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。

在公众号的开发里面用的const Promise = require('bluebird');const request = Promise.promisify(require('request'));这两句代码,之前一直没弄明白是啥意思,后来发现这是将callback函数重新用promise来实现。

什么是 promisify和promisifyAll

promisify 就是把带有 callback 函数,变成重新用 promise 来实现的一种技术方案,它能一劳永逸的解决:如何把函数都用 promise 重新实现的问题。

如果说 promisify 只能一次转一个函数,那 promisifyall 的作用就是一次把一个库的文件转完。

怎么使用

const Promise = require('bluebird');

const **= Promise.promisify(require('**'));

promisify

prmoisify的作是:将一个 nodeCallback 形式函数调用转为 promise

这里需要解释一下: nodeCallback 是什么意思。

nodeCallbackNodejs 中的一个常用词。表达是意思是:Nodejs 中,以错误优先的回调函数的总称。

它包括两个意思:

  1. nodeCallback 回调函数签名。
  2. nodeCallBack 回调函数出现的位置。

nodeCallback 签名

该回调函数的签名__一定__是这样:

// 这样是对的
function fooCallBack(err, a, b){
// something
console.log(a,b);
} // 这样不对
function foo1CallBack(a,b,err){ }
可以看到,fooCallBack 函数的调用参数中,第一个参数是: err, 也就是说的 noodeCallBack 函数的第一个参数__一定__传入的是 err ,而不能是别的参数。只要满足了这个条件,都可叫 nodeCallback

nodeCallBack 出现的顺序

nodeCallBack 一定出现在异步函数的最后一个,也就是这样:

// 这样是对的。
function foo(a,b,nodeCallback){
// pass
} // 这样就不是 nodeCallback
function foo(a,nodeCallback,b){
// pass
}

只要满足了签名和顺序,就可以叫做 nodeCallBack

nodeCallback 存在哪里呢?告诉你吧,所有的 NodeJS 标准包中异步的地方都是它。

好了说了这么多 nodeCallback,现在来说说 promosify 怎样使用:

const Promise = require('bluebird');
const fs = require('fs'); // 回调形式,这里的callback 就是 nodeCallback
fs.readFile('./test.js',function(err,data){
console.log(data);
}); // promisify 形式
const readFileAsync = Promise.promisify(fs.readFile); readFileAsync('./test.js').then(function(data){
console.log(data);
}).catch(console.log);

很简单吧。具体实现就不说了,想要了解的去 google 吧。

promisifyAll

如果说 promisify 只能一次转一个函数,那 promisifyall 的作用就是一次把一个库的文件转完。

说的更清楚一点,promisifyall 能把一个库中有函数全部变成 promise 的形式,改变后的函数都带上了 Async 的后缀。看代码:

const Promise = require('bluebird');

const fs = Promise.promisifyAll(require('fs'));

fs.readFileAsync('./test.js').then(function(data){
console.log(data);
}).catch(console.log);

从上面可以知道:fs 这个标准库,经过 promisifyall , 所有的函数都已经被 promise 化了。而被 promise 化的函数名变成了:原来的函数名+Async

结论

当学会使用 promisify 和 promisifyAll 这两个方法,我相信大家以后都对:如何把函数都用promise方式实现? 这样的问题胸有成竹了吧。

参考博客:https://cnodejs.org/topic/576f9b5dd3baaf401780bba2

最新文章

  1. 自定义AlertDialog控件的使用(AndroidStudio)
  2. bzoj3527: [Zjoi2014]力
  3. 转:AngularJS的Filter用法详解
  4. react 调用 native 的callShareAllFunc()方法,实现分享
  5. JAVA继承时构造函数的问题
  6. 【BZOJ】【2668】【CQOI2012】交换棋子
  7. 常见hash算法的原理
  8. Android反编译教程
  9. wpa_supplicant无线网络配置
  10. Python之路Day13
  11. CentOS下tmux安装与使用
  12. Apache的最小配置
  13. python 标准库 -- os
  14. AMDP + XLSX Workbench 报表开发模式
  15. 磁盘性能评价指标—IOPS和吞吐量
  16. gai_strerror函数
  17. 使用Gitlab实现自动化部署与持续集成
  18. Windows Server 2012 R2 或 2016 无法安装 .NET Framework 3.5.1
  19. transition的用法以及animation的用法
  20. 关于LayoutInflater的错误用法(警告提示:Avoid passing null as the view root)

热门文章

  1. 使用 SQL SERVER PROFILER 监测死锁
  2. python字符串反转 高阶函数 @property与sorted(八)
  3. 【Hibernate那点事儿】—— Hibernate应该了解的知识
  4. OC 类 的声明
  5. 2019.03.19 ZJOI2019模拟赛 解题报告
  6. intellij 无法导入 SimpleTagSupport问题
  7. SpringMVC学习记录一——入门介绍和入门程序
  8. java多线程(简单介绍)
  9. ASP.NET MVC中使用表单上传文件时的注意事项
  10. div鼠标悬停,子元素上移,鼠标移出,子元素下移动画。