对bluebird的理解
前言
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
对bluebird的理解的更多相关文章
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- JS魔法堂:剖析源码理解Promises/A规范
一.前言 Promises/A是由CommonJS组织制定的异步模式编程规范,有不少库已根据该规范及后来经改进的Promises/A+规范提供了实现 如Q, Bluebird, when, rsvp. ...
- promise/bluebird源码
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/bluebirdsource 本博客同步在http://www.cnb ...
- 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
第一部分,Promise 加入 ES6 标准 原文地址 http://www.cnblogs.com/wangfupeng1988/p/6515855.html 未经作者允许不得转载! 从 jquer ...
- Promise, Generator, async/await的渐进理解
作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...
- node.js的Promise库-bluebird示例
前两天公司一哥们写了一段node.js代码发给我,后面特意提了一句“写的不太优雅”.我知道,他意思是回调嵌套回调,因为当时比较急也就没有再纠结.然而内心中总记得要解决这个问题.解决node.js的回调 ...
- 理解promise 01
原文地址: http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html 用Javascript的小伙伴们,是时候承认了,关于 ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- 深入理解 JavaScript 异步——转载
本文章转载于深入理解 JavaScript 异步 前言 2014年秋季写完了<深入理解javascript原型和闭包系列>,已经帮助过很多人走出了 js 原型.作用域.闭包的困惑,至今仍能 ...
随机推荐
- Selenium2学习(三)-- 八种元素元素定位(Firebug和firepath)
前言 自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇主要讲如何用firefox辅助工具进行元素定位.元素定位在这四个环节中是至关 ...
- 数据结构与算法分析java——树1
1. 基本术语 度(degree):一个节点的子树个数称为该节点的度: 树中结点度的最大值称为该树的度. 层数(level):从根结点开始算,根节点为1 高度(height)/深度(depth):节点 ...
- cs229 斯坦福机器学习笔记(一)-- 入门与LR模型
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/Dinosoft/article/details/34960693 前言 说到机器学习,非常多人推荐的学习资 ...
- BAT的云
近期,关于用国内那家云非常纠结! 我也来说道说道各家云. 首先,说说我想要的云服务(按优先级): 0.最好能提供二级域名.移动互联网时代,顶级域名必需要吗?在手机浏览器上输入长长的域名非常蛋痛(即不要 ...
- react工程目录简介
首先我们可以看到底部一个 yarn.lock的文件,这个文件主要是项目依赖的安装包,他的一些版本号,会在这里做一些限制,这个文件不要动就好了. readme.md,这个文件其实是项目的说明文件,他里面 ...
- SpringBoot使用PageHelper进行分页
因为SpringBoot就是为了实现没有配置文件,因此之前手动在Mybatis中配置的PageHelper现在需要重新配置,而且配置方式与之前的SSM框架中还是有点点区别. 首先需要在pom文件 ...
- samb共享
1. 2. 3. ssh root@192.168.10.1 cd /etc smbpasswd -a root 在提示下创建新密码即可 4. 在Mac下的finder内使用快捷键command + ...
- HTML5之表单新增类型介绍
1.html5的input标签的type类型新增介绍: 2.表单新增属性介绍: 3.代码示例: <!doctype html> <html> <head></ ...
- 【题解】洛谷P2426删数
链接 https://www.luogu.org/problemnew/show/P2426 念念碎 第一次接触到区间DP(瑟瑟发抖) 所以象征性地看了一下题解 这好像是一道比较基础的区间DP吧 但是 ...
- SpringBoot非官方教程 | 第二十三篇: 异步方法
转载请标明出处: 原文首发于https://www.fangzhipeng.com/springboot/2017/07/11/springboot-ansy/ 本文出自方志朋的博客 这篇文章主要介绍 ...