
原生的Promise只提供了基础的API,满足不了项目中的应用,bluebird包扩展了这部分,提供了大量高级应用。在性能方面,暂时领先于原生的Promise。
安装
1 | npm i bluebird -S |
引入
1 | const Promise = require('bluebird') |
使用
核心方法(Core)
同步检查(Synchronous inspection)
集合操作(Collections)
1 | // 查询用户数量: |
Promise.all - 同时执行多个promise
返回的是一个数组
1 | let con = {} |
Promise.props - 以对象的形式同时执行多个promise
返回的是一个对象,可以利用es6解构函数获取对应的数据,
1 | let con = {} |
Promise.any - 任何一个promise完成立即返回
1 | Promise.any(Iterable<any>|Promise<Iterable<any>> input) -> Promise |
类似于Promise.some,返回第一个执行成功的值
1 | let con = {} |
Promise.some - 执行指定个数的promise成功后返回
1 | Promise.some( |
同时执行多个promise,在有count个promise完成后返回,返回的是一个数组,按照返回的顺序排序。
同时ping四个网址,返回执行最快的2个1
2
3
4
5
6
7
8Promise.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 | Promise.map( |
- 按照指定方法执行map操作,返回执行成功后的数组或者iterable promise。
- concurrency可以并行执行多个promise
- 直到所有的promise按照mapper执行完成后,才返回。如果有任一个promise reject,则整个map操作reject。
- Promise.map不能保证数据返回的顺序。
一个最常用的列子是替代.push + Promise.all1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var 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 | Promise.filter( |
遍历给定的用户ids,找出男生1
2
3
4
5Promise.filter(ids, function(id) {
return User.findById(id).exec().then((user) => {
return user.gender === 'male'
})
}, 3) // 3代表一次最多执行3个
Promise.each - 依次执行promise
更新用户的时间1
2
3Promise.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