bluebird学习

原生的Promise只提供了基础的API,满足不了项目中的应用,bluebird包扩展了这部分,提供了大量高级应用。在性能方面,暂时领先于原生的Promise。

安装

1
npm i bluebird -S

引入

1
const Promise = require('bluebird')

使用

核心方法(Core)

同步检查(Synchronous inspection)

集合操作(Collections)

1
2
3
4
5
6
7
8
9
// 查询用户数量:
function countUser(con) {
return User.count(con).exec()
}

// 查询用户列表
function findUserList(con) {
return User.find(con).exec()
}

Promise.all - 同时执行多个promise

返回的是一个数组

1
2
3
4
5
let con = {}
let result = await Promise.all([countUser(con), findUserList(con)])

let count = result[0]
let list = result[1]

Promise.props - 以对象的形式同时执行多个promise

返回的是一个对象,可以利用es6解构函数获取对应的数据,

1
2
3
4
5
6
7
let con = {}
let { count, list } = await Promise.props({
count: countUser(con),
list: findUserList(con)
})

// todo something with count, list

Promise.any - 任何一个promise完成立即返回

1
Promise.any(Iterable<any>|Promise<Iterable<any>> input) -> Promise

类似于Promise.some,返回第一个执行成功的值

1
2
3
4
let con = {}
let data = await Promise.any([countUser(con), findUserList(con)])

// data可能是count,也可能是list,谁也执行完,值就是谁

Promise.some - 执行指定个数的promise成功后返回

1
2
3
4
Promise.some(
Iterable<any>|Promise<Iterable<any>> input,
int count
) -> Promise

同时执行多个promise,在有count个promise完成后返回,返回的是一个数组,按照返回的顺序排序。

同时ping四个网址,返回执行最快的2个

1
2
3
4
5
6
7
8
Promise.some([
ping("ns1.example.com"),
ping("ns2.example.com"),
ping("ns3.example.com"),
ping("ns4.example.com")
], 2).spread(function(first, second) {
console.log(first, second);
});

Promise.map - Map操作

1
2
3
4
5
Promise.map(
Iterable<any>|Promise<Iterable<any>> input,
function(any item, int index, int length) mapper,
[Object {concurrency: int=Infinity} options]
) -> Promise
  • 按照指定方法执行map操作,返回执行成功后的数组或者iterable promise。
  • concurrency可以并行执行多个promise
  • 直到所有的promise按照mapper执行完成后,才返回。如果有任一个promise reject,则整个map操作reject。
  • Promise.map不能保证数据返回的顺序。

一个最常用的列子是替代.push + Promise.all

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var promises = [];
for (var i = 0; i < fileNames.length; ++i) {
promises.push(fs.readFileAsync(fileNames[i]));
}
Promise.all(promises).then(function() {
console.log("done");
});

// Using Promise.map:
Promise.map(fileNames, function(fileName) {
// Promise.map awaits for returned promises as well.
return fs.readFileAsync(fileName);
}).then(function() {
console.log("done");
});

Promise.mapSeries - 顺序执行promise

类似于promise.map,但是要顺序执行promise

Promise.reduce - reduce操作

Promise.filter - filter操作

使用给定的function过滤出满足条件的promise,返回的是个数组。

1
2
3
4
5
Promise.filter(
Iterable<any>|Promise<Iterable<any>> input,
function(any item, int index, int length) filterer,
[Object {concurrency: int=Infinity} options]
) -> Promise

遍历给定的用户ids,找出男生

1
2
3
4
5
Promise.filter(ids, function(id) {
return User.findById(id).exec().then((user) => {
return user.gender === 'male'
})
}, 3) // 3代表一次最多执行3个

Promise.each - 依次执行promise

更新用户的时间

1
2
3
Promise.each(ids, function(id) {
return User.findByIdAndUpdate(id, {updated: new Date()})
})

Promise.race - 竞速执行promise,返回第一个,不管成功or失败

资源管理

###


ref:
http://bluebirdjs.com/docs/api-reference.html
https://itbilu.com/nodejs/npm/VJHw6ScNb.html#api-promisify