前言
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
是什么意思。
nodeCallback
是 Nodejs
中的一个常用词。表达是意思是:Nodejs
中,以错误优先的回调函数的总称。
它包括两个意思:
nodeCallback
回调函数签名。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