前言

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

对bluebird的理解的更多相关文章

  1. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  2. JS魔法堂:剖析源码理解Promises/A规范

    一.前言 Promises/A是由CommonJS组织制定的异步模式编程规范,有不少库已根据该规范及后来经改进的Promises/A+规范提供了实现 如Q, Bluebird, when, rsvp. ...

  3. promise/bluebird源码

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/bluebirdsource 本博客同步在http://www.cnb ...

  4. 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise

    第一部分,Promise 加入 ES6 标准 原文地址 http://www.cnblogs.com/wangfupeng1988/p/6515855.html 未经作者允许不得转载! 从 jquer ...

  5. Promise, Generator, async/await的渐进理解

    作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...

  6. node.js的Promise库-bluebird示例

    前两天公司一哥们写了一段node.js代码发给我,后面特意提了一句“写的不太优雅”.我知道,他意思是回调嵌套回调,因为当时比较急也就没有再纠结.然而内心中总记得要解决这个问题.解决node.js的回调 ...

  7. 理解promise 01

    原文地址: http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html 用Javascript的小伙伴们,是时候承认了,关于 ...

  8. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  9. 深入理解 JavaScript 异步——转载

    本文章转载于深入理解 JavaScript 异步 前言 2014年秋季写完了<深入理解javascript原型和闭包系列>,已经帮助过很多人走出了 js 原型.作用域.闭包的困惑,至今仍能 ...

随机推荐

  1. sqlserver row_number函数的用法

    ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号 必须和over一起使用 select *,ROW_NUMBER() over(order by prod ...

  2. day013-流

    1. 常用函数式接口 1.1 Predicate接口 有时候我们需要对某种的数据进行判断,从而得到一个boolean值结果.这时可以使用java.util.function.Predicate< ...

  3. 【Spring实战】—— 2 构造注入

    本文讲解了构造注入以及spring的基本使用方式,通过一个杂技演员的例子,讲述了依赖注入属性或者对象的使用方法. 如果想要使用spring来实现依赖注入,需要几个重要的步骤: 1 定义主要的类和需要分 ...

  4. 第二次Surm冲刺

    一.小组完成情况: 因为技术原因,小组部分代码还没有完成,现在已经可以实现简单的借书与还书操作. 二.个人情况 我对代码进行了测试,与大家进相关的讨论. 三.总结 这次实验的团队合作真的很重要,有许多 ...

  5. 第二次scrum冲击

    1.小组第二次冲刺任务及其完成情况描述. 本次冲刺我们小组经过讨论,实现的使我们爱上长大系统中的失物招领功能,由于在实际的实现中,对于本功能的逐渐深入和了解,渐渐发现这个功能实现起来需要由很多部分组成 ...

  6. BZOJ1718:[USACO]Redundant Paths 分离的路径(双连通分量)

    Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numb ...

  7. 逻辑回归(分类问题)(Logistic Regression、罗杰斯特回归)

    逻辑回归:问题只有两项,即{0, 1}.一般而言,回归问题是连续模型,不用在分类问题上,且噪声较大,但如果非要引入,那么采用逻辑回归模型. 对于一般训练集: 参数系统为: 逻辑回归模型为:      ...

  8. 【题解】POJ 2115 C Looooops (Exgcd)

    POJ 2115:http://poj.org/problem?id=2115 思路 设循环T次 则要满足A≡(B+CT)(mod 2k) 可得 A=B+CT+m*2k 移项得C*T+2k*m=B-A ...

  9. lucene&solr学习——分词器

    下图是语汇单元的生成过程: 从一个Reader字符流开始,创建基于Reader的Tokenizer分词器,经过三个TokenFilter生成语汇单元Tokens. 要看分词器的分析效果,只需要看Tok ...

  10. 菜鸟笔记 -- Chapter 6.2.4 成员方法

    6.2.4  成员方法 在Java中使用成员方法对应于类对象的行为,在有些地方也会将方法称之为函数,成员方法是定义在类中具有特定功能的一段独立小程序.方法格式如下: 修饰符 返回值类型 成员方法名 ( ...