5.2 Bluebird
Bluebird是Node.js最出名的Promise实现,除了实现标准的Promise规范之外,Bluebird还提供了包装方法,可以快速地将Node.js回调风格的函数包装为Promise。
Node.js回调风格的函数如下:
function(err, data1, data2, ..., dataN)
回调函数的第1个参数永远为Error对象,如果出现错误,则err值是Error对象;如果未出现错误,则err值为null。
Bluebird的使用
使用Bluebird模块前需要使用npm安装:
npm install bluebird --save
bluebird.promisifyAll()可以将Node.js回调风格的函数包装为Promise函数,该方法签名如下:
bluebird.promisifyAll(target, options)
· target需要包装的对象。如果target是普通对象,则包装后生成的异步API只有该对象持有;如果target是原型对象,则包装后生成的异步API被所有实例持有。
· options选项:
suffix:异步API方法名后缀,默认为“Async”。如fs.readFile()函数包装后生成的异步API为fs.readFileAsync。
multiArgs:是否允许多个回调参数,默认false。我们知道Promise的then()方法只接受一个参数,而callback则可以回调多个参数,multiArgs为true时,bluebird将所有callback参数传入一个数组,Promise.then()接受该数组,从而得到多个参数。
bluebird.promisifyAll()只会给目标对象添加新方法,原来的Node.js回调风格的方法不受影响。
包装之后的方法和包装之前的方法使用起来只有一个差别,那就是不要传递回调函数,通过Promise获取结果。
下面是包装fs对象的示例,fs不是原型对象,也没有fs实例,因此直接包装fs对象即可。
以上两种方法的结果没有区别,通过Promise包装,可以批量地将对象进行Promise处理,结合async/await,可以极大地提升异步编程体验。