Bluebird
2021-07-26 18:05:23 大约 2 分钟
Promise
对象已在ECMAScript 2015中被写入标准,且已被最新版本的浏览器和Node.js/IO.js所支持。bluebird
是Node.js最出名的一个第三方Promise
规范实现库,除了实现标准的Promise规范之外,Bluebird还提供了包装方法,可以快速地将Node.js回调风格的函数包装为Promise。它不仅完全兼容原生Promise
对象,且比原生对象功能更强大。
# 安装
npm安装,cmd输入以下命令 官方文档 (opens new window)
npm i bluebird
1
# 使用
这里只简单介绍下,把不是异步的回调函数,包装成promise来使用;官方文档 (opens new window)
# Promise.promisify
(opens new window)
将单个回调函数转换为promise函数。它不会改变原始函数并返回修改后的函数。
# 1.text
hello word
1
2
3
2
3
// test.js
const fs = require('fs');
const bluebird = require('bluebird');
// 回调函数的书写形式
// fs.readFile('./1.text', 'utf-8', (err, result) => {
// console.log(result);
// })
// 把fs.readFile包装为promise
const readFile = bluebird.promisify(fs.readFile)
readFile('./1.text', 'utf-8').then(res => {
console.log(res);
})
readFile('../1.text', 'utf-8').catch(err => {
console.log(err);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 输入结果
C:\Users\wangy\Desktop\test> node .\test.js
[OperationalError: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {
cause: [Error: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\wangy\\Desktop\\1.text'
},
isOperational: true,
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\wangy\\Desktop\\1.text'
}
hello word
PS C:\Users\wangy\Desktop\test>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Promise.promisifyAll
(opens new window)
获取一个充满函数的对象,并将每个函数转换为带有Async
后缀的新函数(默认情况下)。它不会改变原有的功能,而是增加了新的功能。
const fs = require('fs');
// 把 fs模块 包装为promise
const bluebird = require('bluebird').promisifyAll(fs);
fs.readFileAsync('./1.text', 'utf-8').then(res => {
console.log(res);
})
fs.readFileAsync('../1.text', 'utf-8').catch(err => {
console.log(err);
})
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 输入结果
PS C:\Users\wangy\Desktop\test> node .\test.js
[OperationalError: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {
cause: [Error: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\wangy\\Desktop\\1.text'
},
isOperational: true,
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\wangy\\Desktop\\1.text'
}
hello word
PS C:\Users\wangy\Desktop\test>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
提示
新方法后缀为Async
,如fs.readFileAsync
。它没有取代fs.readFile
功能。
注意
Promise.promisify
并Promise.promisifyAll
为真正快速的包装器使用动态重新编译,因此调用它们应该只进行一次。