Node.js+Webpack开发实战
上QQ阅读APP看书,第一时间看更新

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,可以极大地提升异步编程体验。